Я использую C ++ DLL в своем приложении.
type
Tcl_bla = function(filename: PChar): Integer; cdecl;
var
cl_bla: Tcl_bla;
function CallLibraryProc(Proc: String): Pointer;
begin
Result := GetProcAddress(Handle, PChar(Proc));
if not Assigned(Result) then
Loaded := False;
if not Loaded then
MessageBox(0, PChar('Error => ' + Proc), 'Alert', MB_OK or MB_TOPMOST);
end;
...
Handle := SafeLoadLibrary(
PChar(CurrentPath + Dll),
SEM_FAILCRITICALERRORS or SEM_NOGPFAULTERRORBOX or SEM_NOOPENFILEERRORBOX
);
if (Handle < HINSTANCE_ERROR) then
raise Exception.Create(
Dll + ' library can not be loaded or not found.' + SysErrorMessage(GetLastError)
);
if Handle <> 0 then
begin
// blabla
cl_bla := CallLibraryProc('cl_bla');
end;
...
FreeLibrary(Handle);
Приведенные выше коды отлично работают с D6. Я пытаюсь перенести свой код, чтобы он мог работать в Delphi с поддержкой Unicode, но у меня возникла проблема.
Я прочитал документацию от Embarcadero о GetProcAddress
procedure CallLibraryProc(const LibraryName, ProcName: string);
var
Handle: THandle;
RegisterProc: function: HResult stdcall;
begin
Handle := LoadOleControlLibrary(LibraryName, True);
@RegisterProc := GetProcAddress(Handle, PAnsiChar(AnsiString(ProcName)));
end;
Я не могу попробовать это, потому что я не знаю, как объявить LoadOleControlLibrary!
Мой CallLibraryProc может загрузить DLL, но каким-то образом cl_bla работает неправильно.
Я думаю, что проблема с моим кодом из-за параметра GetProcAddress или ... возможно, мой перенесенный заголовок неправильный.