Sprawdziłem co jest nie tak i muszę stwierdzić, że... nie wiem :]
Wykonałem taką małą aplikację aby przetestować pobieranie łańcucha z funkcji z biblioteki DLL; Kod całego modułu biblioteki DLL:
library pchrdll;
function GetPCharFromDLL(AInput: PChar): PChar; stdcall;
const
RETURN_VALUE = String('PChar from DLL!');
RETURN_VALUE_LEN = Length(RETURN_VALUE);
begin
if AInput^ = '0' then
// zwykłe przypisanie
Result := 'Zero'
else
begin
// skopiowanie z jakiegoś bufora - tutaj ze stałej łańcuchowej
GetMem(Result, RETURN_VALUE_LEN);
Move(RETURN_VALUE[1], Result^, RETURN_VALUE_LEN);
end;
end;
exports
GetPCharFromDLL;
begin
end.
No i kod zdarzenia OnClick
przycisku ładującego tekst z funkcji z DLL:
procedure TMainForm.btnLoadPCharClick(Sender: TObject);
var
hLibrary: THandle;
GetPCharFromDLL: function(AInput: PChar): PChar; stdcall;
pchrValue: PChar;
begin
hLibrary := LoadLibrary('DLL\pchrdll.dll');
try
@GetPCharFromDLL := GetProcAddress(hLibrary, 'GetPCharFromDLL');
if @GetPCharFromDLL = nil then
Application.MessageBox('cannot load function from library.', 'PChar from DLL', MB_ICONSTOP)
else
begin
pchrValue := GetPCharFromDLL('1');
edtDLLPChar.Text := StrPas(pchrValue);
end;
finally
FreeLibrary(hLibrary);
end;
end;
Po wciśnięciu przycisku ładowana jest funkcja z biblioteki, po czym zostaje wywołana, a jej rezultat ląduje w zmiennej pchrValue
, z której zostaje skopiowany do komponentu edtDLLPChar
; Jeśli w parametrze funkcji GetPCharFromDLL
poda się łańcuch '0'
- funkcja zwróci słowo 'Zero'
; W przeciwnym razie zwróci łańcuch 'PChar from DLL!'
;
@Rafał D - źródło zarówno biblioteki, jak i programu ją obsługującego dołączam do posta.