Hallo zusammen,
ich habe mich an
diesem Beispiel orientiert, um die Kommunikation Anwendung <->
DLL zu steuern.
Es geht darum, Ressourcen aus einer
DLL zu holen.
Das Ganze funktioniert auch wunderbar, bis das Stringende-Zeichen, also #0, im String auftaucht. Das Problem sollte bekannt sein. Leider funktioniert die von Luckie genannte Lösung bei mir nicht so wie erwartet, soll heissen, dass der Inhalt der Ressource nur bis zum Satzende-Zeichen geladen wird.
Hier der Code:
DLL
Delphi-Quellcode:
Function GetRessource(Res: String; PResult: PChar; PResultLength: Integer): Integer;
Var
s: String;
Begin
Result := 0;
s := '';
With TResourceStream.Create(HInstance, Res, RT_RCDATA) Do
Try
SetLength(s, Size);
Read(s[1], Size);
Finally
Free;
End;
If Assigned(PResult) Then Begin
StrLCopy(PResult, PChar(s), PResultLength);
End;
Result := Length(s);
End;
Hauptprogramm:
Delphi-Quellcode:
Type
TGetRessource =
Function(Res:
String; PResult: PChar; PResultLength: Integer): Integer;
TfrmMain =
Class(TForm)
Button1: TButton;
Procedure Button1Click(Sender: TObject);
Procedure FormCreate(Sender: TObject);
Procedure FormDestroy(Sender: TObject);
private
DLLHandle: Integer;
PGetRessource: TGetRessource;
End;
Procedure TfrmMain.Button1Click(Sender: TObject);
Var
PRes: PChar;
PResLength: Integer;
Begin
PRes :=
Nil;
PResLength := 0;
PResLength := PGetResByName('
meine_ressource',
Nil, 0);
GetMem(PRes, PResLength + 1);
PResLength := PGetResByName('
meine_ressource', PRes, PResLength + 1);
End;
Procedure TfrmMain.FormCreate(Sender: TObject);
Begin
Try
DLLHandle := LoadLibrary(pchar('
Ressource.dll'));
If (DLLHandle <> 0)
Then Begin
@PGetRessource := GetProcAddress(DLLHandle, PChar('
GetRessource'));
End Else
Raise Exception.CreateFmt('
Ressource.dll not found', []);
Except
Raise;
End;
End;
Procedure TfrmMain.FormDestroy(Sender: TObject);
Begin
FreeLibrary(DLLHandle);
End;
Wäre nett, würde mir jemand auf die Sprünge helfen.