Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi DLL-TClientSocket事件_Delphi_Events_Dll_Cobol_Tclientsock - Fatal编程技术网

Delphi 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事件

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

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

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

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

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


我怎样才能解决这个问题?是否可以向我的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;