Delphi DLL-TClientSocket事件
我有一个带有TClientSocket组件的DLL,它用于与电话系统机器对话。DLL在exports方法中只有PChar参数,并且没有使用包 当我用Delphi应用程序加载DLL时,所有事件都正常工作,到目前为止没有问题 我的客户正在从控制台Win32 Cobol程序调用此DLL,TClientSocket在其发生时不会触发事件,它使用主循环调用DLL中的检查方法,以了解是否有任何来自电话系统的返回,如果返回OK,则调用Get方法,问题发生在这里: 在TClientSocket.OnRead事件中,我调用了TClientSocket.Socket.ReceiveText,并且服务器应用程序有几个返回,这让我认为只有当我从DLL调用一个方法时才会触发该事件,而TClientSocket在缓冲区中有几个返回 问题是我找不到任何分隔符来拆分此返回Delphi DLL-TClientSocket事件,delphi,events,dll,cobol,tclientsock,Delphi,Events,Dll,Cobol,Tclientsock,我有一个带有TClientSocket组件的DLL,它用于与电话系统机器对话。DLL在exports方法中只有PChar参数,并且没有使用包 当我用Delphi应用程序加载DLL时,所有事件都正常工作,到目前为止没有问题 我的客户正在从控制台Win32 Cobol程序调用此DLL,TClientSocket在其发生时不会触发事件,它使用主循环调用DLL中的检查方法,以了解是否有任何来自电话系统的返回,如果返回OK,则调用Get方法,问题发生在这里: 在TClientSocket.OnRead事件
我怎样才能解决这个问题?是否可以向我的DLL中添加任何内容,以确保每次从Delphi程序调用OnRead事件时都会触发该事件?您的DLL中可能需要一个消息循环。。(控制台应用程序缺少消息泵..)。因此,在dll构造函数中实现如下内容:
var Msg : TMsg;
res : Integer;
.. . 请看一个类似的线程
最近,我遇到了一个与您类似的问题,我的dll中的clientsocket可以与delphi exe一起工作,但不能与c-console exe一起工作,我记得
tclientsocket
正在使用选择事件模式,这需要主线程来处理消息循环,所以
如果您在dll中使用具有非块模式的tclientsocket,则主机不应阻止主线程,并且必须执行消息循环(例如,在控制台程序中调用时)
有时我们不能修改主机代码(我遇到的情况),那么我们可以这样做
socket.sendtext();
repeat s :=socket.recevtext;
until timeout or length(s)>0;
当然,您需要检查s是否是完整的数据包。我在DLL主过程中这样做了,在第一次交互中,DLL在GetMessage中停止,并且不向前移动。现在我知道GetMessage等待它收到消息,所以我改为PeekMessage,但它返回-1,所以它熄灭。如果我删除了测试,那么它就永远不会加载应用程序。Cesar,可能罪魁祸首是COBOL应用程序看到另一个类似的线程(它是.net,但似乎正在处理相同的问题)GX,我认为解决方案是将TClientSocket移动到DLL内的线程,然后将循环添加到execute方法。现在,我正在解析器中工作,以使当前版本正常工作,并将使用线程启动新版本。完成后我会把结果贴在这里。谢谢你迄今为止的帮助。
socket.sendtext();
repeat s :=socket.recevtext;
until timeout or length(s)>0;