Форум: "Основная";
Текущий архив: 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;
{.......}
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.01.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c