Einzelnen Beitrag anzeigen

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, 00: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