AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Funktionen dynamisch laden

Ein Thema von hedie · begonnen am 21. Apr 2008 · letzter Beitrag vom 23. Apr 2008
Antwort Antwort
Seite 2 von 3     12 3      
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#11

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 12:24
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
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#12

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 12:53
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#13

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 12:59
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

Der neue aufruf

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 _ Hinzugefügt...
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#14

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 13:02
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).
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#15

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 13:04
Ok hmmm

Und das die meldung nicht immer kommt is normal?

Und wie kann ich das nun korrekt lösen?
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#16

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 13:08
das die meldung nicht immer kommt ist auch normal. Lösung:
Delphi-Quellcode:
//dll
procedure FreeObj(Obj: TObject); stdcall;
begin
  Obj.Free;
end;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#17

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 13:09
Und diese Procedure soll ich wann aufrufen?
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#18

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 13:14
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.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
hedie

Registriert seit: 12. Dez 2005
Ort: Schweiz
1.024 Beiträge
 
Delphi XE6 Starter
 
#19

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 13:17
also muss ich das create in der anwendung machen wo ich die DLL Lade?
Claudio
Tu was du nicht lassen kannst
- http://endasmedia.ch
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#20

Re: DLL Funktionen dynamisch laden

  Alt 22. Apr 2008, 13:33
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
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.
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