首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi DLL - TClientSocket事件

Delphi DLL - TClientSocket事件
EN

Stack Overflow用户
提问于 2010-07-01 22:42:03
回答 2查看 1.6K关注 0票数 1

我有一个带有TClientSocket组件的动态链接库,它是用来与电话系统机器对话的。DLL在exports方法中只有PChar参数,并且没有使用包。

当我用Delphi应用程序加载DLL时,所有事件都工作得很好,到目前为止没有问题。

我的客户从控制台Win32 Cobol程序调用此动态链接库,而TClientSocket在事件发生时不触发事件,它使用主循环调用动态链接库中的检查方法,以了解电话系统是否有任何返回,如果返回OK,则调用Get方法,以下是问题发生的地方:

在TClientSocket.OnRead事件中,我调用了TClientSocket.Socket.ReceiveText,并且有几个来自服务器应用程序的返回,这让我认为只有当我从DLL调用一个方法时才会触发该事件,并且TClientSocket在缓冲区中保存了几个返回。

问题是我找不到任何分隔符来分割这个返回值。

我该如何解决这个问题呢?有没有什么我可以添加到我的DLL中,以确保OnRead事件在每次不是从Delphi程序调用时都会被触发?

EN

回答 2

Stack Overflow用户

发布于 2010-07-01 23:54:16

您可能需要在dll中使用消息循环。(控制台应用程序缺少消息泵。)。因此,在dll构造函数中实现如下代码:

代码语言:javascript
复制
var Msg : TMsg;
     res : Integer;

。。

代码语言:javascript
复制
While true Do Begin
        res := Integer( GetMessage(Msg, 0, 0, 0 ));
        If res = -1 Then
          Exit  // error
        else if res = 0 then
          exit  // WM_QUIT received
        else begin
          TranslateMessage( Msg );
          DispatchMessage( Msg );
        end;
End; { While }

看一下类似的线程http://www.mofeel.net/1102-comp-lang-pascal-delphi-misc/2763.aspx

票数 2
EN

Stack Overflow用户

发布于 2012-03-02 21:06:34

最近,我遇到了一个与你类似的问题,我在dll中的clientsocket在delphi-exe上运行得很好,但在c-console exe上就不行了,而且我记得tclientsocket使用的是select-event模式,它需要主线程来处理消息循环,所以,

如果您在dll中使用具有非阻塞模式的tclientsocket,则主机永远不应该阻塞主线程,并且必须执行消息循环(例如,在控制台程序中调用时)。

有时我们不能修改主机代码(我遇到的情况),然后我们可以这样做

代码语言:javascript
复制
socket.sendtext();
repeat s :=socket.recevtext; 
until timeout or length(s)>0; 

当然,您需要检查s是否是完整的数据包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3158844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档