Hallo!
Ich habe eine
DLL erstellt, die eine Funktion enthält. Dieser Funktion wird ein ShortString übergeben, dieser wird verarbeitet und das Ergebnis wieder zurückgegeben. Da zur Verarbeitung Komponeneten (
Indy) notwendig sind, wird während der Laufzeit dynamisch eine Form erzeugt, auf der diese Komponeneten liegen. Die Form soll nicht angezeigt werden.
Das ganze sieht dann so aus:
Delphi-Quellcode:
uses
SysUtils, Forms,
Dialogs,
IdHttp,
IdAntiFreeze,
Classes,
ShareMem,
components in 'components.pas' {FormComponents};
{$R *.res}
procedure NewExit;
begin
FormComponents.Free;
end;
function getHTTP(sURL: ShortString) : ShortString; stdcall;
var
sReturnValue : ShortString;
begin
try
sReturnValue := FormComponents.IdHTTP1.Get(sURL);
except
sReturnValue := 'http.dll: Bei der Verbindungsanforderung ist ein Fehler aufgetreten';
end;
result := sReturnValue;
end;
exports
getHTTP;
begin
FormComponents := TFormComponents.Create(Application);
AddExitProc(NewExit);
end.
Die
DLL habe ich anschließend wie folgt ein ein Testprogramm eingebunden:
Delphi-Quellcode:
function getHTTP(sURL: ShortString) : ShortString; stdcall;external 'http.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Text := getHttp(Edit1.Text);
end;
Zuerst die gute Nachricht:
Die Anwendung läuft und die eingebundene Funktion kann beliebig oft korrekt ausgeführt werden
Die schlechte Nachricht aber:
Beim Beenden der Anwendung kommt es zu einer ungültigen Zeigeropertion. Egal ob die Funktion innerhalb der DLL aufgerufen wurde oder nicht.
Ich kann leider nicht erkennen ob oder dass ich irgendwo etwas vergessen hätte - wohl auch weil mir im Umgang mit DLLs noch Erfahrung fehlt. Wäre nett, wenn mir jemand einen entscheidenden Tipp geben könnte.
Grüße aus dem Saarland
Michael