DLL:
Delphi-Quellcode:
library StringDLL;
uses
SysUtils;
function Foonction(Data: PWideChar; Buffer: PWideChar; lenBuffer: Cardinal): Cardinal; stdcall;
var
S: string;
begin
S := 'foo' + Data;
if Assigned(Buffer) then
StrLCopy(Buffer, PWideChar(S), lenBuffer)
;
Result := Length(S);
end;
exports
Foonction;
begin
end.
@Luckie, Length() is function from Delphi
Here you are complete code with variants I tried to static load and call StringDLL.dll-->Foonction():
Delphi-Quellcode:
function Foonction(Data: PWideChar; Buffer: PWideChar; lenBuffer: Cardinal): Cardinal; external 'StringDLL.dll';
// 1:
var
Buffer: string;
BufferSize: DWORD;
begin
BufferSize := Foonction('bar', nil, 0);
if BufferSize > 0 then
begin
SetLength(Buffer, BufferSize);
Foonction('bar', PWideChar(Buffer), BufferSize);
end
else
Buffer := '';
ShowMessage(Buffer);
end;
// 2:
var
Buffer: PWideChar;
BufferSize: DWORD;
begin
BufferSize := Foonction('bar', nil, 0);
ShowMessage(IntToStr(BufferSize));
GetMem(Buffer, BufferSize + 1);
try
Foonction('bar', Buffer, BufferSize + 1);
ShowMessage(Buffer);
finally
FreeMem(Buffer);
end;
end;
// 3:
var
Buffer: array [0..MAX_PATH - 1] of Char;
BufferSize: DWORD;
begin
BufferSize := High(Buffer);
ShowMessage(IntToStr(Foonction('bar', Buffer, BufferSize)));
Caption := Buffer;
end;
All of them working when Foonction() is in EXE, none of them working if Foonction() is in
DLL - raises
AV in
DLL.