![]() |
Re: DLL Funktionen dynamisch laden
Habe solch eine Funktion in der DLL
Delphi-Quellcode:
Aufgerufen wird sie folgendermasen:
function hwfunc():TMemoryStream;stdcall;
var vfile:TStringlist; begin result := TMemoryStream.Create; vfile := tstringlist.Create; vfile.Add('Test :D'); vfile.SaveToStream(result); vfile.Free; result.Position := 0; end;
Delphi-Quellcode:
Und es funktioniert alles einwandfrei :D
DynMain.ContentStream := dynfunc(nil);
DynMain.WriteContent; dynfunc(nil).Free; |
Re: DLL Funktionen dynamisch laden
irgendwas passt da aber nicht zusammen.
Du rufst eine Funktion auf und gibst einen parameter mit obwohl die Funktion keinen Hat. Dann erstellst du in der Funktion eine Objectinstanz. Und anschließend rufst du die Funktion nochmal auf, es wird wieder eine Objectinstanz erstellt welche aber sofort wieder frei gegeben wird. Die erste wird scheinbar nie frei gegeben und der zweite Aufruf der Funktion ist völlig sinnlos. |
Re: DLL Funktionen dynamisch laden
Hmmm.... ich hab das nun noch ein wenig modifiziert...
Neie DLL Funktion
Delphi-Quellcode:
Das es ein paar unschönheiten hat weiss ich.... is erst experimentell :D
function hwfunc(ReqInfo:TIdHTTPRequestInfo;ResInfo:TIdHTTPResponseInfo):TMemoryStream;stdcall;
var vfile:TStringlist; begin result := TMemoryStream.Create; vfile := tstringlist.Create; vfile.Add('Test hahah _:D'); vfile.SaveToStream(result); vfile.Free; result.Position := 0; ResInfo.ContentStream := result; ResInfo.WriteContent; result.Free; end; Der neue aufruf
Delphi-Quellcode:
Auch dies funktioniert wieder jedoch
dynfunc(ARequestInfo,AResponseInfo);
meldet er ab und zu Ungültige Zeigeroperation Jedoch bricht das programm nicht ab sondern die Meldung wird zum text Test haha _:D Hinzugefügt... |
Re: DLL Funktionen dynamisch laden
die ungültige zeigeroperation kommt daher das du speicher außerhalb der dll frei gibst welcher aber in der dll angefordert wurde. Die DLL und das Hauptprogramm haben getrennte Speichermanager (sofern nicht ShareMem etc. verwendet wird). Du kannst also nicht einfach den Speicher eines anderen Memorymanagers frei geben.
Prinzipiell sollte man (guter Stil) Daten dort frei geben wo sie auch angefordert werden (Ebene sowie Modul). |
Re: DLL Funktionen dynamisch laden
Ok hmmm
Und das die meldung nicht immer kommt is normal? Und wie kann ich das nun korrekt lösen? |
Re: DLL Funktionen dynamisch laden
das die meldung nicht immer kommt ist auch normal. Lösung:
Delphi-Quellcode:
//dll
procedure FreeObj(Obj: TObject); stdcall; begin Obj.Free; end; |
Re: DLL Funktionen dynamisch laden
Und diese Procedure soll ich wann aufrufen?
|
Re: DLL Funktionen dynamisch laden
Delphi-Quellcode:
Ich denke nicht. Schließlich willst du außerhalb der DLL auf das Ergebnis der Funktion zu greifen.
function hwfunc(ReqInfo:TIdHTTPRequestInfo;ResInfo:TIdHTTPResponseInfo):TMemoryStream;stdcall;
var vfile:TStringlist; begin result := TMemoryStream.Create; vfile := tstringlist.Create; vfile.Add('Test hahah _:D'); vfile.SaveToStream(result); vfile.Free; result.Position := 0; ResInfo.ContentStream := result; ResInfo.WriteContent; result.Free; / <-- Soll das da wirklich sein ??????????? end; Sauber wäre:
Delphi-Quellcode:
Wobei Result außerhalb der DLL allociert und freigegeben werden sollte. :)
Procedure hwfunc(Var Result:TMemoryStream;ReqInfo:TIdHTTPRequestInfo;ResInfo:TIdHTTPResponseInfo);stdcall;
var vfile:TStringlist; begin vfile := tstringlist.Create; vfile.Add('Test hahah _:D'); vfile.SaveToStream(result); vfile.Free; result.Position := 0; ResInfo.ContentStream := result; ResInfo.WriteContent; end; |
Re: DLL Funktionen dynamisch laden
also muss ich das create in der anwendung machen wo ich die DLL Lade?
|
Re: DLL Funktionen dynamisch laden
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz