AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi TIdTCPServerConnection an Dll übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

TIdTCPServerConnection an Dll übergeben

Ein Thema von F.W. · begonnen am 24. Apr 2006 · letzter Beitrag vom 25. Apr 2006
Antwort Antwort
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#1

TIdTCPServerConnection an Dll übergeben

  Alt 24. Apr 2006, 01:37
Hallo zu so später (oder früher? ) 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 = 'PLUGINCALLthen 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 DATETIMEthen 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
  Mit Zitat antworten Zitat
24. Apr 2006, 02:00
Dieses Thema wurde von "alcaeus" von "Sonstige Fragen zu Delphi" nach "Internet / LAN / ASP.NET" verschoben.
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: TIdTCPServerConnection an Dll übergeben

  Alt 24. Apr 2006, 02:13
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?
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#4

Re: TIdTCPServerConnection an Dll übergeben

  Alt 24. Apr 2006, 11:34
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.
  Mit Zitat antworten Zitat
Benutzerbild von F.W.
F.W.

Registriert seit: 28. Jul 2003
Ort: Zittau
636 Beiträge
 
#5

Re: TIdTCPServerConnection an Dll übergeben

  Alt 25. Apr 2006, 23:25
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?
  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 03:36 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