![]() |
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:
Code der Dll:
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;
Delphi-Quellcode:
Ich kann das ganze einmal machen, ein zweites Mal erscheint dann eine Zugriffsverletzung und danach eine EIdConnClosedGracefully Exception.
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 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
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Internet / LAN / ASP.NET" verschoben.
|
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? |
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. |
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 21: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