Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL Funktionen dynamisch laden (https://www.delphipraxis.net/112456-dll-funktionen-dynamisch-laden.html)

hedie 22. Apr 2008 11:24

Re: DLL Funktionen dynamisch laden
 
Habe solch eine Funktion in der DLL

Delphi-Quellcode:
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;
Aufgerufen wird sie folgendermasen:

Delphi-Quellcode:
DynMain.ContentStream := dynfunc(nil);
DynMain.WriteContent;
dynfunc(nil).Free;
Und es funktioniert alles einwandfrei :D

SirThornberry 22. Apr 2008 11:53

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.

hedie 22. Apr 2008 11:59

Re: DLL Funktionen dynamisch laden
 
Hmmm.... ich hab das nun noch ein wenig modifiziert...

Neie DLL Funktion

Delphi-Quellcode:
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;
Das es ein paar unschönheiten hat weiss ich.... is erst experimentell :D

Der neue aufruf

Delphi-Quellcode:
dynfunc(ARequestInfo,AResponseInfo);
Auch dies funktioniert wieder jedoch
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...

SirThornberry 22. Apr 2008 12:02

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).

hedie 22. Apr 2008 12:04

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?

SirThornberry 22. Apr 2008 12:08

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;

hedie 22. Apr 2008 12:09

Re: DLL Funktionen dynamisch laden
 
Und diese Procedure soll ich wann aufrufen?

Ghostwalker 22. Apr 2008 12:14

Re: DLL Funktionen dynamisch laden
 
Delphi-Quellcode:
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;
Ich denke nicht. Schließlich willst du außerhalb der DLL auf das Ergebnis der Funktion zu greifen.


Sauber wäre:

Delphi-Quellcode:
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;
Wobei Result außerhalb der DLL allociert und freigegeben werden sollte. :)

hedie 22. Apr 2008 12:17

Re: DLL Funktionen dynamisch laden
 
also muss ich das create in der anwendung machen wo ich die DLL Lade?

sirius 22. Apr 2008 12:33

Re: DLL Funktionen dynamisch laden
 
Zitat:

Zitat von hedie
also muss ich das create in der anwendung machen wo ich die DLL Lade?

Wenn du den Memorystream auch in der Anwendung brauchst: Ja


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz