Delphi DLL - TClientSocket事件

时间:2010-07-01 14:42:03

标签: delphi events dll cobol tclientsock

我有一个带有TClientSocket组件的DLL,它用于与电话系统机器通信。 DLL在导出方法中只有PChar参数,并且不使用包。

当我使用Delphi app加载DLL时,所有事件都可以正常工作,到目前为止没问题。

我的客户从控制台Win32 Cobol程序调用此DLL,并且TClientSocket在事件发生时不会触发事件,它使用主循环调用DLL中的检查方法,以确定是否有任何从电话返回系统,如果它返回OK,则调用Get方法,这就是问题发生的地方:

在TClientSocket.OnRead事件中,我调用了TClientSocket.Socket.ReceiveText,并且有几个来自服务器应用程序的返回,是什么让我觉得只有当我从DLL调用一个方法时触发该事件,并且TClientSocket持有几个在缓冲区中返回。

问题是我找不到任何分隔符来拆分此返回。

我该如何解决这个问题?有什么东西可以添加到我的DLL中以确保每次没有从Delphi程序调用时触发OnRead事件吗?

2 个答案:

答案 0 :(得分:2)

您可能需要在您的dll中使用消息循环..(控制台应用程序缺少消息泵..)。所以在你的dll构造函数中实现类似的东西:

var Msg : TMsg;
     res : Integer;


。 。

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

答案 1 :(得分:0)

最近,我遇到了类似的问题,我在dll中的clientsocket与delphi-exe工作正常,但c-console exe没有,我记得tclientsocket正在使用select-event模式,需要主线程来处理消息循环,所以,

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

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

socket.sendtext();
repeat s :=socket.recevtext; 
until timeout or length(s)>0; 

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