1

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

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

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

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

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

我怎样才能解决这个问题?有什么我可以添加到我的 DLL 以确保每次不从 Delphi 程序调用 OnRead 事件时都会触发它吗?

4

2 回答 2

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

于 2010-07-01T15:54:16.183 回答
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 是否是完整的数据包左右。

于 2012-03-02T13:06:33.617 回答