动态创建TClientSocket后的问题!

HF 2000-03-26 07:04:00
我想把Socket控件包到dll中去,问如何动态创建
TClientSocket?
我这样做
var
ClientSocket:TClientSocket
.......
ClientSocket:=TClientSocket.Create(nil)
但在 ClientSocket.Open之后要一个ShowMessage()后才能发数据,不知道如何解决?
请指教!谢谢!
...全文
430 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
HF 2000-04-05
  • 打赏
  • 举报
回复
yangfan:
问题是我在Dll中,没有Form,有Form的话就简单啦!
yangfan 2000-04-05
  • 打赏
  • 举报
回复
那你就自己做个从TObject继承来的类把ClientSocket包装起来不就行了吗!!
在它Create时做上面的初始化工作!
如果还有问题email to: zangyongli@263.net
yangfan 2000-03-31
  • 打赏
  • 举报
回复
与hook没什么关系的!

在你的form中加入如下procedure
procedure MySocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MySocketConnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MySocketDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
procedure MySocketError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure MySocketRead(Sender: TObject; Socket: TCustomWinSocket);

Create你的ClientSocket时
ClientSocket:= TClientSocket.Create(nil);
ClientSocket.Address := YourServiceIP;
ClientSocket.OnConnect := MySocketConnect;
ClientSocket.OnDisconnect := MySocketDisConnect;
ClientSocket.OnError := MySocketError;
ClientSocket.OnRead := MySocketRead;
ClientSocket.Active := TRUE;
bConnected := FALSE;

然后在你的
procedure MySocketConnect中令 bConnected := TRUE;

发送数据时判断bConnected即可。

注意在procedure MySocketError 中要将ErrorCode:=0;
Good Luck!!
HF 2000-03-30
  • 打赏
  • 举报
回复
yangfan:
如何动态的写OnConnect事件呢? 还有设置完CbNoBlocking后,如何处理Hook?
yangfan 2000-03-29
  • 打赏
  • 举报
回复
忘了告诉你,TClientSocket.Create(nil) 没问题的,
只是你必须在退出时手工Free.
yangfan 2000-03-29
  • 打赏
  • 举报
回复
cbNoBlocking 非阻塞模式,open后立即会返回,但这时并不表示与服务器建立了联结,只有ClientSocket.OnConnect事件发生后,才表示联结成功,你可以先设立一个通信是否联结的标记,初值为False,在OnConnect中把它置TRUE,在发送数据时判断此标记即可!
HF 2000-03-28
  • 打赏
  • 举报
回复
工作模式我也设了,在open之后是ClientSocket.ClientType :=cbNoBlocking(异步吧,可能拼错了)但跟踪Active还是False,
我在水木清华上看到也有一篇类似的文章,他指出是由于没有工作模式,但还提到消息机制,不知如何理解?sunsetyang你也不妨去看看,有什么好的建议一定要赐教啊!呵呵!谢了!
HF 2000-03-27
  • 打赏
  • 举报
回复
SoftCrazy:
感谢你的回答。
还是有问题,我去掉ShowMessage后,加上了Sleep(1000);这样的话就出现100054错误,不能发数据。
你说的调用在哪里呢?我Open后,就开始SendText了!
还有我写的 ClientSocket:=TClientSocket.Create(nil) 注意这个nil,我不知道这样对不对?有没有什么问题?(在dll中,没有Form)
谢了!
sunsetyang 2000-03-27
  • 打赏
  • 举报
回复
你应该设置一下她的工作模式吧!
E 2000-03-26
  • 打赏
  • 举报
回复
我的理解是:
ClientSocket.Open() 并不等待连接建立好,而是立即返回.
所以Open 后的代码在第一次运行时连接一般还没有建立好,因此不能发送数据.
而你响应showmessage至少要用一两秒时间,此时连接一般已经建立好,故可以
发送数据.
连接建立好之后ClientSocket.OnClientWrite()会被调用,你不妨在此发送你
的第一个数据包.
sunsetyang 2000-03-26
  • 打赏
  • 举报
回复
什么意思?能不能说清楚一点?你将你的发送部分代码贴出来看一下。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧