Zur Übung versuche ich gerade eine
DLL in C zu schreiben, die mir zwei Strings verbindet und diese dann aus einem Delphi-Programm zu nutzen. Ich mache das erstmal mit dem VC2005, weil ich im Moment mit dem GCC und Eclipse nicht weiterkomme.
Meine C-Funktion in der
DLL sieht so aus:
Code:
extern "C" EXPORT int addstr(char *str1, char *str2, char *buffer)
{
strcat(str1, str2);
strcpy(buffer, str1);
return strlen(buffer);
}
Der Delphi Code dazu:
Delphi-Quellcode:
type
TAdd = function(a, b: Integer): Integer; stdcall;
TAddStr = function(str1, str2: PChar; var Buffer: PChar): Integer; stdcall;
procedure TForm1.Button1Click(Sender: TObject);
var
hLib: THandle;
s: String;
Add: TAdd;
AddStr: TAddStr;
res: Integer;
str1, str2: String;
Buffer: PChar;
begin
s := IncludeTrailingBackSlash(ExtractFilePath(ParamStr(0)))+ 'FirstDLL.dll';
hLib := LoadLibrary(PChar(s));
if hLib <> 0 then
begin
@Add := GetProcAddress(hLib, 'add');
if Assigned(Add) then
begin
res := Add(40, 2);
ShowMessage(IntToStr(res));
end
else
ShowMessage(SysErrorMessage(GetLastError));
@AddStr := GetProcAddress(hLib, 'addstr');
if Assigned(AddStr) then
begin
str1 := 'Hello ';
str2 := 'World';
GetMem(Buffer, length(str1) + length(str2));
try
res := AddStr(PChar(str1), PChar(str2), Buffer);
ShowMessage(string(Buffer));
finally
FreeMem(Buffer);
end;
end
else
ShowMessage(SysErrorMessage(GetLastError));
FreeLibrary(hLib);
end
else
ShowMessage(SysErrorMessage(GetLastError));
end;
Aber ich bekomme in der
DLL eine AccessViolation.