我在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.
接收响应消息是写在一个线程里面的;这个线程可以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.
解决方案 »
- delphi中的实现复制,粘贴,删除功能,怎样实现鼠标选中了的判断?求指点
- 生日散分
- 菜鸟求助关于DBgrid的问题
- 怎么Copy一条或多条记录
- 如何用SQL格式化一个IP地址?我得到的IP地址是一串数字,想显示为255.255.255.255那样的样子。
- 我想备份文件夹,不知该怎么做!
- 再次散分,来者或UP者有分,这个问题有代表性和通用性.如能帮忙解决,另单独奉上300分!在线等待.一个小时内结账!
- 在多个DBEdit修改了客户端数据,什么消息会被触发呢??
- oyo111111(卖火柴的),你在哪儿?清帮帮忙!
- 请问如何清除Internet Explorer 的历史记录,是否有可用的API函数。
- 100分求动态加载TreeView的实例??
- 请 neweipeng 进来领分,非常感谢对我的帮助!
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中运行没问题