我有一个带有TClientSocket组件的动态链接库,它是用来与电话系统机器对话的。DLL在exports方法中只有PChar参数,并且没有使用包。
当我用Delphi应用程序加载DLL时,所有事件都工作得很好,到目前为止没有问题。
我的客户从控制台Win32 Cobol程序调用此动态链接库,而TClientSocket在事件发生时不触发事件,它使用主循环调用动态链接库中的检查方法,以了解电话系统是否有任何返回,如果返回OK,则调用Get方法,以下是问题发生的地方:
在TClientSocket.OnRead事件中,我调用了TClientSocket.Socket.ReceiveText,并且有几个来自服务器应用程序的返回,这让我认为只有当我从DLL调用一个方法时才会触发该事件,并且TClientSocket在缓冲区中保存了几个返回。
问题是我找不到任何分隔符来分割这个返回值。
我该如何解决这个问题呢?有没有什么我可以添加到我的DLL中,以确保OnRead事件在每次不是从Delphi程序调用时都会被触发?
发布于 2010-07-01 23:54:16
您可能需要在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
发布于 2012-03-02 21:06:34
最近,我遇到了一个与你类似的问题,我在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是否是完整的数据包。
https://stackoverflow.com/questions/3158844
复制相似问题