Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-52633
maxi
2001-10-23 11:45
2002.01.17
Как передать серверу интерфейс клиента


3-52513
vangog
2001-12-17 10:55
2002.01.17
порядковый номер строки в DBGrid


7-52672
Olgerd
2001-09-08 01:57
2002.01.17
Прозрачность окон


14-52660
zvon
2001-11-23 07:03
2002.01.17
как программно отправить файл на мыло


1-52545
Smok_er
2001-12-28 05:37
2002.01.17
Exception EJPEG





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский