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 = '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