AGB  ·  Datenschutz  ·  Impressum  







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

Stream an DLL übergeben

Ein Thema von sephraina · begonnen am 6. Jul 2015 · letzter Beitrag vom 9. Jul 2015
Antwort Antwort
sephraina

Registriert seit: 17. Feb 2015
36 Beiträge
 
Delphi XE7 Professional
 
#1

Stream an DLL übergeben

  Alt 6. Jul 2015, 13:16
Hallo Zusammen,

zuerst einmal bin ich mir nicht sicher ob das Thema im richtigen Forum platziert ist...

Mein Problem ist folgendes:
ein idhttp-client schickt einen Stream an den Server. Dieser zeigt ihn auch bei Aufruf des Arequestinfo.PostStream an.
Nur muss ich diesen aber noch in meine DLL bekommen, da von dort die Weiterverarbeitung läuft.

Meine Frage konkret: wie übergebe ich einen Stream an eine DLL?
(In dem gesendeten Stream ist ein xml-Dokument verpackt.)

Wenn der Client ein Get-Request macht hole ich so die Daten aus der DLL:
Delphi-Quellcode:
procedure TFServer.IdHTTPServer1CommandGet(AContext: TIdContext;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var s: TMemorystream;
    str : TStringstream;
    df: string;
    p: integer;
    Handle: THandle;
    Anzeigen: TAnzeigen;

begin
    s:= TMemorystream.Create;
    str:= TStringStream.Create;
    p := pos('/',ARequestInfo.URI);
    df := rightstr(ARequestInfo.URI, length(ARequestInfo.URI)-p);
    try
    handle := Loadlibrary(pchar('PServerDLL.dll'));
    if handle <> 0 then
       begin
           //*******************************GET********************************
           if ARequestInfo.Command ='GET'  then
              begin
                   @Anzeigen := GetProcAddress(Handle,PCHAR('DataOutputStr'));
                   if @Anzeigen <> nil then s := Anzeigen(df,xm); //<<-- funktioniert, liefert ein Stream an den Client zurück mit Inhalt: xml-File welches angefordert wurde
              end
            //*******************************POST**********************************
             else if ARequestInfo.Command ='POST'  then
                  begin
                       showmessage('Post1');
                       //str.LoadFromStream(Arequestinfo.PostStream);
                       //showmessage('pServer: '+str.DataString);

                       @Anzeigen := GetProcAddress(Handle,PCHAR('DataInputStr')); //<<-- 'DataInputStr' ist die procedure die den Stream in der DLL aufnehmen soll
                       if @Anzeigen <> nil then s := Anzeigen(df,xm);

                  end


       end;
    AResponseInfo.ContentStream := s; //<<--- Zurück an Server
Hoffe jemand weiss zu helfen..

Update:
(function in der DLL ist: function DataInputStr(c: string; x: IXMLDocument): TMemoryStream; Also in die DLL komme ich, nur wenn ich den Stream-Inhalt abrufe, ist er leer.
Wenn ich das x des Xml-Dokumentes abfrage ist da nur das Dummy-xml drin und nicht das welches der client gesendet hat.

Geändert von sephraina ( 6. Jul 2015 um 13:31 Uhr)
  Mit Zitat antworten Zitat
Photoner

Registriert seit: 6. Dez 2012
Ort: Nürnberg
103 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Stream an DLL übergeben

  Alt 6. Jul 2015, 16:26
Ich habe es leider noch nicht verstanden was du da genau vorhast, aber mir fällt folgendes auf:

Du erzeugst den MemoryStream zweimal

s := TMemoryStream.Create; und in der Dll vermutlich noch einmal:

function DataInputStr(c: string; x: IXMLDocument): TMemoryStream; Entweder den Stream als Parameter übergeben und sich auch ums Freigeben kümmern oder die Dll erzeugen lassen und dann nach dem Aufruf freigeben (finde ich nicht so toll).
Chris
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Stream an DLL übergeben

  Alt 6. Jul 2015, 18:39
Eine Klassen-Instanz tauscht man niemals über die Anwendungsgrenzen hinaus.

Was man austauschen kann ist ein Speicherbereich und bei einem Stream würde sich ja ein Byte-Array anbieten. Das liegt einfach so im Speicher und kann dann problemlos ausgetauscht werden. Ein Delphi-Referenz durchsuchenIStream würde auch funktionieren.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Stream an DLL übergeben

  Alt 7. Jul 2015, 05:35
Hallo,
da es sich um eine Xml-Datei handelt,
könntest du sie auch als String übergeben,
den StringStream hast du ja bereits.


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#5

AW: Stream an DLL übergeben

  Alt 7. Jul 2015, 08:55
Hallo,


ein wenig OT:

Zitat:
Eine Klassen-Instanz tauscht man niemals über die Anwendungsgrenzen hinaus.
@Sir Rufo Was verstehts du unter Klassen-Instanz (=Object???) und seit wann überschreitet man Anwendungsgrenzen wenn man eine DLL dynamisch einbindet?

mfg

frank
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Stream an DLL übergeben

  Alt 7. Jul 2015, 09:32
Nun ich verstehe unter einer Klassen-Instanz das, was allgemein üblich als Klassen-Instanz verstanden wird:

Das ist eine Klasse:
Delphi-Quellcode:
type
  TMyClass = class
  end;
Das ist eine Instanz dieser Klasse:
Delphi-Quellcode:
var
  MyClassInstance: TMyClass;
begin
  MyClassInstance := TMyClass.Create; // Instanz erzeugen und die Referenz zu dieser Instanz in der Instanz-Referenz-Variablen ablegen
end;
Seit wann man die Anwendungsgrenzen überschreitet ... lass mich kurz überlegen ... seit schon immer?

Nachlesen kann man das zur Genüge hier im Forum, bei google, bei ...

Das Problem ist einfach, dass der Klassentyp TMyClass , wenn dieser der Anwendung und der DLL bekannt sind, trotzdem beide NICHT gleich sind, denn die DLL hat daraus einen eigenen Typen erstellt und die Anwendung auch. Die heißen gleich, sind aber nicht gleich.

Oder warum, denkst du, muss man sich beim Verwenden der Windows API immer mit diesen Struct und PChar herumschlagen?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 7. Jul 2015 um 09:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:07 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