Имею следующее. Библиотека, которая должна загружаться автоматически.
Код:
library pcInfo;
uses
SysUtils,
Classes, Windows;
function GetSysInfo: PChar; stdcall;
var
Size : Cardinal;
PRes : PChar;
ORes : String;
begin
// Имя компьютера
Size := MAX_COMPUTERNAME_LENGTH + 1;
PRes := StrAlloc(Size);
If GetComputerName(PRes, Size) Then ORes:=StrPas(PRes);
Result:= PChar(ORes);
end;
exports GetSysInfo;
begin
end
Ну и собственно программу, для динамического вызова библиотеки.
Код:
type
TFunction = function : PChar;
DLLFunction: TFunction;
implementation
{$R *.dfm}
Function ExecDLLFunction(DLLName : PChar; FunctionName : PChar) : PChar;
var
hndDLLHandle: THandle;
DLLFunction: TFunction;
begin
try
// загружаем dll динамически
hndDLLHandle := loadLibrary ( DLLName );
if hndDLLHandle <> 0 then
begin
// получаем адрес функции
@DLLFunction := getProcAddress ( hndDLLHandle, FunctionName );
// если адрес функции найден
if addr ( DLLFunction ) <> nil then
begin
Result := DLLFunction;
end
else
// DLL не найдена ("handleable")
showMessage ( 'Function not exists...' );
end
else
// DLL не найдена ("handleable")
showMessage ( 'DLL not found...' );
finally
// liberar
freeLibrary ( hndDLLHandle );
end;
end;
Function ExecDLLFunction1(DLLName : PChar; FunctionName : PChar) : PChar;
var
hndDLLHandle: THandle;
begin
@DLLFunction :=nil;
hndDLLHandle := loadLibrary ( DLLName );
if hndDLLHandle >= 32 then
begin
@DLLFunction := getProcAddress(hndDLLHandle, FunctionName);
if @DLLFunction <> nil then
begin
Result := DLLFunction;
end;
freeLibrary ( hndDLLHandle );
end;
end;
Memo1.Lines.Add(ExecDLLFunction1('pcinfo.dll','GetSysInfo'));
Так вот оба способа загрузки DLL и вызова процедуры выдает ошибку при выходе. В чем причина ???
Есть ли нормальный работающий пример по динамической загрузке библиотек и вызове процедур.