@DeddyH:
Der Code produziert leider einen Absturz.
Bei mir (Delphi XE) nicht.
DLL:
Delphi-Quellcode:
library MyDLL;
uses
SysUtils,
Windows;
const
ERROR_NO_ERROR = 0;
ERROR_BUFFER_TOO_SMALL = 1;
function delphi_getString(Buffer: PAnsiChar; var BufSize: DWORD): DWORD; cdecl;
var
Test: AnsiString;
begin
Test := 'Hallo Welt';
if BufSize < Length(Test) then
Result := ERROR_BUFFER_TOO_SMALL
else
begin
StrPCopy(Buffer, Test);
Result := ERROR_NO_ERROR;
end;
BufSize := Length(Test);
end;
exports
delphi_getString;
begin
end.
Und das Testprojekt:
Delphi-Quellcode:
function delphi_getString(Buffer: PAnsiChar; var BufSize: DWORD): DWORD; cdecl;
external 'MyDLL.dll' name 'delphi_getString';
procedure TForm1.Button1Click(Sender: TObject);
var
s: Ansistring;
BufSize: DWORD;
begin
BufSize := 0;
delphi_getString(nil, BufSize);
SetLength(s, BufSize);
delphi_getString(PAnsiChar(s), BufSize);
ShowMessage(s);
end;
Wobei die Konstanten eigentlich in eine eigene
Unit gehören, die von
DLL und Testprojekt eingebunden wird, aber das habe ich mir hier gespart.