Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Вниз

Помогите пожалуйста с импортом DLL 


Yuri Btr   (2001-12-29 10:40) [0]

При запуске программы импортируется библиотека, возможно ли импортировать её только при обращении к этой функции (например при нажатии на кнопку)
Заранее спасибо.
Есть такой кусок кода:

private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Function NetMessageBufferSend (servername: LPCWSTR; msgname: LPCWSTR; fromname: LPCWSTR; buf: Pointer; buflen: DWORD): longint; stdcall; external "netapi32.dll";
implementation



Vitaly   (2001-12-29 11:15) [1]

LoadLibrary?



Yuri Btr   (2001-12-29 11:34) [2]

Ну что LoadLibrary - это ясно, но можно ли задекларировать Function NetMessageBufferSend не подлинковывая к ней библиотеку сразу, а только после например анализа операционки. Т.К. сия библиотека доступна только для Windows NT,XP,2K и не хочется писать отдельную прогу для WinME где не будет только этой ф-ии.



Vitaly   (2001-12-29 11:50) [3]

Сразу не понял...
IMHO, нельзя.
Заодно, погляди ссылочку http://www.akzhan.midi.ru/win32api/40.htm
Правда на С.



Aleksey Pavlov   (2001-12-29 11:55) [4]

>> Yuri Btr:
Вы, как мне кажется, не совсем чётко представляете механизм загрузки DLL вашей программой.
Если вы используете статическую загрузку, то вы должны понимать, что при запуске вашей программы DLL, загружаемая вами статически будет отображена на адресное пространство процесса вашей программы и освободит память только после того как этот процесс будет уничтожен.
Если вы используете динамическую загрузку, то вы можете загружать DLL из любого места вашей программы (LoadLibrary) и освобождать память в любом месте DLLHandle.Free;
Таким образом возможно следующее:

...
if condition then
begin
...
try
DLLHandle:=LoadLibrary("MyLib.dll");
...
// работаешь с нужными ф-ями и процедурами получая указатели на них
...
finally
DLLHandle.free;
end; {try}



Yuri Btr   (2001-12-29 12:27) [5]

to Aleksey Pavlov
Большое спасибо за понятное объяснение. Видимо эта функция требует статической загрузки DLL.



Наталья   (2001-12-29 13:02) [6]

Yuri Btr © (29.12.01 12:27)
> Видимо эта функция требует статической загрузки
Из чего это следует? Можно грузить динамически...

Type
TNetMessageBufferSend=function(
servername:PWideChar ;
msgname:PWideChar ;
fromname:PWideChar ;
buf:PWideChar ;
buflen:DWORD):DWORD;stdcall;
...

var
NetMessageBufferSend:TNetMessageBufferSend;
DLLHandle:THandle;
begin
DLLHandle:=LoadLIbrary("NetApi32.DLL");
try

NetMessageBufferSend:=GetProcAddress(DLLHandle,"NetMessageBufferSend");
if not (@NetMessageBufferSend=nil)
then
begin

NetMessageBufferSend(nil,NameMsg,nil,Msg,Length(Msg)*2);

end;
finally
FreeLibrary(DllHandle);
end;



USAtyj   (2001-12-29 14:03) [7]



type
TForm1 = class(TForm)
...............
function NetSend(Host,Msg: String):boolean;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
NetMessageBufferSend: function (ServerName,
MsgName,FromName:PWideChar;
Buf:Pointer;BufLen:DWord):word; stdcall;

implementation

......

function TForm1.NetSend(Host,Msg: String):boolean;
var
HLib:HModule;
PWCHost,PWCMsg: PWideChar;
begin
@NetMessageBufferSend:=nil;
HLib:=LoadLibrary("netapi32.dll");
if HLib<>0 then
begin
@NetMessageBufferSend:=GetProcAddress(HLib,"NetMessageBufferSend");
if @NetMessageBufferSend<>nil then
begin
try
Error:=1;
GetMem(PWCHost, 2*Length(Host)+2);
GetMem(PWCMsg, 2*Length(Msg)+2);
StringToWideChar(Host, PWCHost, Length(Host)+2);
StringToWideChar(Msg, PWCMsg, Length(Msg)+2);
Error:=NetMessageBufferSend(nil, PWCHost,nil,PWCMsg,2*Length(Msg));
finally
FreeMem(PWCHost);
FreeMem(PWCMsg);
Result := (Error=0);
end;
end;
FreeLibrary(HLib);
end;
end;


end.



skaminski!   (2001-12-29 17:55) [8]

Анализируешь ОС или что-там, в зависимости от результата делаешь LoadLibrary соотв. функции.

Типі функций определяешь заранее (с параметрами)


Type
func1 = procedure (x: integer);

func2 = procedure (x: string);


{.......}
if OS = WIN_NT then
begin
// LoadLibrary etc
// GetProcAddress etc
// func1
end
else
begin
// соответственно
end;

{.......}





Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.026 c
14-52666          MJH                   2001-11-18 13:56  2002.01.17  
nVidia Drivers 21.88


14-52662          Dima-k17              2001-11-23 09:56  2002.01.17  
(1)Windows XP + (2)Delphi 5


1-52584           sergant               2001-12-28 16:32  2002.01.17  
Как поменять цвет шрифта в Memo?


3-52499           Alexandr Suvorov      2001-12-05 11:26  2002.01.17  
Запись данных в dBase????


1-52601           shnitken              2001-12-30 09:57  2002.01.17  
Label1.Font.Color