Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   DLL y TCPClient (o ClientSocket) (https://www.clubdelphi.com/foros/showthread.php?t=67596)

HombreGordo 25-04-2010 11:06:21

DLL y TCPClient (o ClientSocket)
 
Saludos cordiales a todos, :)

Desde hace algún tiempo me he interesado por la escritura de programas sin GUI, con Delphi (el IDE al que ya estoy acostumbrado), sin embargo lo encuentro un poco difícil para algunas cosas, debido a mi inexperiencia en el campo.

Sucede que quiero escribir un DLL que trabaje en cierta forma como una aplicación, que cuando la ejecute con rundll32 ejemplo.dll,DllMain se mantenga abierta y que responda a las conexiones con los objetos correspondientes a los cuales les asigno comandos. Yo puedo lograr esto perfectamente para un ejecutable, pero no para un DLL, y he aquí mi duda.

Tengo el siguiente código:
Código Delphi [-]
library ejemplo;

uses
  SysUtils,
  Classes,
  Dialogs,
  Sockets,
  ShellApi;

var
DLLHandle: Longint = 0;
TCPClient: TTCPClient;
sRecr : string;

{$R *.res}

procedure DllMain; export;
begin
while (1 = 1) do begin
  ReadSocket;
end;
end;

procedure ReadSocket;
begin
sRecr:=TCPClient.Receiveln('');
sRecr:=Trim(sRecr);
if sRecr = 'test' then
  begin
    ShowMessage('Probando.');
  end;
end;

exports DllMain;

begin
TCPClient:=TTCPClient.Create(nil);
TCPClient.RemotePort:='6999'; // el puerto de escucha
TCPClient.RemoteHost:='127.0.0.1'; // aquí tengo una app con un TServerSocket escuchando
TCPClient.Active:=True;
ShellExecute(DLLHandle, 'open', 'calc', nil, nil, 4);  // me aseguro de que este bloque se ejecute
end.

En el DllMain intenté hacer como una especie de loop, para que interpretara esos mensajes que yo le enviara por la otra aplicación. Sin embargo, justamente cuando cierro la otra aplicación, que el ShowMessage hace efecto. ¿Alguna idea? :confused: (Debería hacer efecto cuando yo envíe el comando)

PD: Creo que se podría complicar con los componentes Indy, y por eso no los empleo. Por eso tengo en cierta forma mi propio parser de comandos sencillo y "buggy".
PD2: Me gustaría que me ayudasen ya sea con TCPClient o ClientSocket, realmente no tengo problemas en usar alguno de los dos (aunque me manejo más con ClientSocket).

DriverOp 25-04-2010 11:59:31

Me parece que el problema lo tienes en la otra aplicación porque Receiveln() se ejecuta hasta que aparece un retorno de carro (o la conexión se cierra).

Pero el código que has puesto me hace pensar que lo que quieres hacer es que esta DLL sea un servidor, no un cliente, entonces deberías usar un componente servidor TCP.

HombreGordo 25-04-2010 22:20:43

Gracias por su ayuda, Ud. tiene la razón jejej, es que como Ud. dice, Receiveln se ejecuta cuando encuentra un final de línea, me dí cuenta de cuál final de línea era ese, cuando ví que dice const eol: String = #$D#$A entonces ahí supe que retorno del carro debía enviar (estaba enviando #13+#10 y por eso no se ejecutaba).


La franja horaria es GMT +2. Ahora son las 13:20:02.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi