我在COM+中用了INDY控件TIdTCPClient,一是用来给TIdTCPServer发送消息,二是用来接收TIdTCPServer响应的消息,
接收响应消息是写在一个线程里面的;这个线程可以EXE程序运行,但是在COM+中没有运行,有人知道其中的原有吗?谢谢
unit COMTCPUnit;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComServ, ComObj, VCLCom, StdVcl, bdemts, DataBkr, DBClient,
  MtsRdm, Mtx, PCOMTCP_TLB, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, DB, ADODB;type  TCommBlock = record   // the Communication Block used in both parts (Server+Client)
                 Command,
                 MyUserName,                 // the sender of the message
                 Msg,                        // the message itself
                 ReceiverName: string[100];  // name of receiver
               end;type
  TClientHandleThread = class(TThread)
   private
    CB: TCommBlock;
    procedure HandleInput;   protected
    procedure Execute; override;  end;type
  TCOMTCP = class(TMtsDataModule, ICOMTCP)
    Client: TIdTCPClient;
    qrySave: TADOQuery;
    ADOConnection1: TADOConnection;
    qrySavevValue: TWideStringField;
    procedure ClientConnected(Sender: TObject);
  private
    { Private declarations }
  protected
    class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
    procedure SetTCPActive; safecall;
    procedure SetTCPNotActive; safecall;
    procedure SendData; safecall;
    function GetStr: WideString; safecall;
  public
    Returnstr: string[100];
    isOK: boolean;
    CB1: TCommBlock;    { Public declarations }
  end;var
  COMTCP: TCOMTCP;
  ClientHandleThread: TClientHandleThread;   // variable (type see above)
implementation{$R *.DFM}class procedure TCOMTCP.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
  if Register then
  begin
    inherited UpdateRegistry(Register, ClassID, ProgID);
    EnableSocketTransport(ClassID);
    EnableWebTransport(ClassID);
  end else
  begin
    DisableSocketTransport(ClassID);
    DisableWebTransport(ClassID);
    inherited UpdateRegistry(Register, ClassID, ProgID);
  end;
end;{ TClientHandleThread }procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not COMTCP.Client.Connected then   //第一次运行到这里就结束了,以后就不执行了
      Terminate
    else
    try
       COMTCP.Returnstr := COMTCP.Client.ReadLn();
       if COMTCP.Returnstr<>''  then
       begin
        with COMTCP do
        begin
          if qrySave.Active=false then qrySave.Active := true;
          qrySave.Append;
          qrySave.Fields[0].AsString := Returnstr;
          qrySave.Post;
        end;
       end;
    //   COMTCP.Client.ReadBuffer(CB, SizeOf (CB));
   //   ClientFrmMain.strP := ClientFrmMain.Client.ReadLn();
  //    Synchronize(HandleInput);
    except
    end;
  end;
end;procedure TClientHandleThread.HandleInput;
begin
//
end;procedure TCOMTCP.SetTCPActive;
beginend;procedure TCOMTCP.SetTCPNotActive;
begin  try
    ClientHandleThread.Terminate;
    Client.Disconnect;
  except  end;end;procedure TCOMTCP.SendData;
var
  strs: string;
  CommBlock,CommBlock1 : TCommBlock;
begin
  if not Client.Connected then
  BEGIN
   Client.Connect();
{
     ClientHandleThread := TClientHandleThread.Create(True);
     ClientHandleThread.FreeOnTerminate:=True;
     ClientHandleThread.Resume;
     }
 END;
    Client.WriteLn(datetimetostr(now));
    strs := Client.ReadLn();
 //   Returnstr := strs;
{
  CommBlock.Command      := '11111111111111111';         // assign the data
  CommBlock.MyUserName   := '22222222222222222';
  CommBlock.Msg          := '33333333333333333';
  CommBlock.ReceiverName := '44444444444444444';  Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
}
{
  Client.ReadBuffer(CommBlock1, SizeOf (CommBlock1));  Returnstr := CommBlock1.Command+ CommBlock1.MyUserName+ CommBlock1.Msg+ CommBlock1.ReceiverName;
 }
end;function TCOMTCP.GetStr: WideString;
begin
  result := '';
  result := Returnstr;
end;procedure TCOMTCP.ClientConnected(Sender: TObject);
begin   IF Client.Connected then
   begin     ClientHandleThread := TClientHandleThread.Create(True);
     ClientHandleThread.FreeOnTerminate:=True;
     ClientHandleThread.Resume;   end;end;initialization
  TComponentFactory.Create(ComServer, TCOMTCP,
    Class_COMTCP, ciMultiInstance, tmApartment);
end.

解决方案 »

  1.   

    写漏字了:这个线程可以在EXE程序运行,在COM+中运行不。
      

  2.   

    回楼上,调试跟踪发现发现如下:
    procedure TClientHandleThread.Execute; 
    begin 
      while not Terminated do 
      begin 
        if not COMTCP.Client.Connected then  //第一次运行到这里就结束了,以后就不执行了 
          Terminate 
        else 
        try 
          COMTCP.Returnstr := COMTCP.Client.ReadLn(); 
          if COMTCP.Returnstr <>''  then 
          begin 
            with COMTCP do 
            begin 
              if qrySave.Active=false then qrySave.Active := true; 
              qrySave.Append; 
              qrySave.Fields[0].AsString := Returnstr; 
              qrySave.Post; 
            end; 
          end; 
        //  COMTCP.Client.ReadBuffer(CB, SizeOf (CB)); 
      //  ClientFrmMain.strP := ClientFrmMain.Client.ReadLn(); 
      //    Synchronize(HandleInput); 
        except 
        end; 
      end; 
    end; 
    不知道是不是控件的原因,在EXE中运行没问题