Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TIdTCPServerConnection an Dll übergeben (https://www.delphipraxis.net/68050-tidtcpserverconnection-dll-uebergeben.html)

F.W. 24. Apr 2006 00:37


TIdTCPServerConnection an Dll übergeben
 
Hallo zu so später (oder früher? :D ) Stunde!

Ich arbeite jetzt schon seit Tagen an einem Problem:

Ich arbeite mit den Indycompos und habe einen TIdTCPServer auf meinem Formular.
Jetzt möchte ich beim ServerExecute die Connection an eine dynamisch geladene Dll geben, damit die dann einige Readln und Writeln Befehle druchführt.

Wie kann ich das bewerkstelligen?

Ich habe schon etwas, aber das funktioniert nicht so recht:
Code des Programms:
Delphi-Quellcode:
type
  TServerExecute = function(Con: TIdTCPServerConnection): Boolean; stdcall;

  { ... }

function TMainForm.PluginExecute(Con: TIdTCPServerConnection): Boolean;
var
 SExec: TServerExecute;
begin
 
 Result := False;
 if not ActPlugin.Loaded then begin
    Exit;
 end;

 @SExec := GetProcAddress(ActPlugin.Handle, 'ServerExecute');
 if @SExec <> NIL then begin
    Result := SExec(Con);
 end;
end;

procedure TMainForm.ServerExecute(AThread: TIdPeerThread);
var
 S: String;
 FS: TFileStream;
 L: TStrings;
begin
 with AThread.Connection do begin
   S := Readln;

   { ... }

   if S = 'PLUGINCALL' then begin
      PluginExecute(AThread.Connection);
   end;
 end;
end;
Code der Dll:
Delphi-Quellcode:
function ServerExecute(Con: TIdTCPServerConnection): Boolean; stdcall; export;
var
 S: String;
begin
 Result := False;
 S := Con.Readln;

 if S = 'GET DATETIME' then Con.WriteLn(DateTimeToStr(Now));

 Result := True;
end;
Ich kann das ganze einmal machen, ein zweites Mal erscheint dann eine Zugriffsverletzung und danach eine EIdConnClosedGracefully Exception.
Ich habe die Dll zwischendurch nicht aus dem Speicher genommen oder sie anders angerührt!

Am Code selbst oder am aufrufenden Client kanns auch nicht liegen, denn wenn ich den Code der Dll in die Exe kopiere und so auf den Dll-Aufruf verzichte funtzt alles!

Gruß Wyski :wink:

DP-Maintenance 24. Apr 2006 01:00

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Internet / LAN / ASP.NET" verschoben.

himitsu 24. Apr 2006 01:13

Re: TIdTCPServerConnection an Dll übergeben
 
Ich kenn mich zwar mit dem Internetzeugs nicht so aus, aber meine erste Vermutung wäre ein Problem bei der Speicherverwaltung ... du nutzt doch bestimmt den DelphiMM? (hast also keinen anderen MemoryManager eingebunden)

Dieser kann "leider" keinen speicher über Modulgrenzen hinweg verwalten, da für jedes Modul ein eigenständiger MM geladen wird, daher kann Speicher nicht in einem Modul reserviert und in 'nem anderem Modul wieder freigegeben werden, dieses pasiert aber oftmals, wenn Objekte in mehreren Modulen arbeiten sollen.

Also entweder du lagerst solche Codes nicht in ein anderes Modul (z.B. DLL) aus,
oder du versuchst es mal mit einem SharedMemoryManager (z.B. FastMM, FastXMM, RecyclerMM, oder ein anderer)
(falls das nicht hilft, weiß ich auch nicht weiter ._.)



PS: dein Compiler meckert doch nicht etwa ein wenig rum, bei dem Result := False; in ServerExecute?

F.W. 24. Apr 2006 10:34

Re: TIdTCPServerConnection an Dll übergeben
 
Also wenn du das mit der Stringspeicherverwaltung meinst >> die Unit Sharemem ist in die usesKlauseln der EXE und der Dll eingebunden

Beim Result := False meckert er nicht.

F.W. 25. Apr 2006 22:25

Re: TIdTCPServerConnection an Dll übergeben
 
Ich hatte bis jetzt noch keine große Zeit mir das Problem nochmal genauer anzuschauen, da ja wieder Schule ist, aber ich habe eine Vermutung!

Wäre es möglich, dass es daran liegt, dass die TIdTCPServerConnection ja eigentlich von einem Thread (AThread) aufgerufen wird und ich das irgendwie mit Synchronize() aufrufen müsste?

Ich kenne mich nur in Sachen Threads und erst recht nicht mit den Threadsachen vom TCPServer der Indys aus!

Kann mir da vielleicht jemand helfen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:50 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