最近项目中需要变写一个ACTIVEX调用硬件厂商提供的DLL。
DLL中的方法如下:
// function SetControlMode(iMode:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
// function SetComSpeed(sCom:PAnsiChar;iSpeed:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
// function SetNetwork(sIp:PAnsiChar;port:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
// function ConnectDev():Integer;stdcall;external TCPCONTR_DLL_NAME;
// function CloseDev():Integer;stdcall;external TCPCONTR_DLL_NAME;
// function ControlAction(iAct:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
在这些方法中ControlAction没有传IP,所以猜测DLL中有自己的变量。
直接用delphi写不是ACTIVEX的程序调用这个DLL没有问题。
可是写ACTIVEX调用这个DLL,不管是静态调用还是动态调用,在页面上用上半分钟左右都会出问题,也看不出来报的什么错,在ACTIVEX中抓错也抓不到,就是方法不再有返回值,重新连接也连不上,然后按F5刷新后倒是可以连上,但是过一会又会出问题。
这个东西快把我逼疯了,求各位大神指点。
DLL中的方法如下:
// function SetControlMode(iMode:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
// function SetComSpeed(sCom:PAnsiChar;iSpeed:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
// function SetNetwork(sIp:PAnsiChar;port:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
// function ConnectDev():Integer;stdcall;external TCPCONTR_DLL_NAME;
// function CloseDev():Integer;stdcall;external TCPCONTR_DLL_NAME;
// function ControlAction(iAct:Integer):Integer;stdcall;external TCPCONTR_DLL_NAME;
在这些方法中ControlAction没有传IP,所以猜测DLL中有自己的变量。
直接用delphi写不是ACTIVEX的程序调用这个DLL没有问题。
可是写ACTIVEX调用这个DLL,不管是静态调用还是动态调用,在页面上用上半分钟左右都会出问题,也看不出来报的什么错,在ACTIVEX中抓错也抓不到,就是方法不再有返回值,重新连接也连不上,然后按F5刷新后倒是可以连上,但是过一会又会出问题。
这个东西快把我逼疯了,求各位大神指点。
数据共享。这也就是说主程序的SyncEvent、SyncList、ThreadLock与DLL中的SyncEvent、
SyncList、ThreadLock变量是不一样的。因此在DLL中的Synchronize同步,
使用到的是DLL中的SyncEvent、SyncList、ThreadLock等变量,因此,直接使用Synchronize,
主程序的CheckSynchronize就无法对DLL中的线程进行同步调度执行。而DLL中的Application
却从来没有运行Run进入消息循环,因此也不能调用CheckSynchronize来处理线程的同步。
因此在DLL中就需要主动调用CheckSynchronize函数来对同步列表SyncList进行处理。
可以在DLL中专门创建一个窗口,在窗口消息循环中处理WM_NULL消息,
调用ChechSynchronize即可。
参见 Delphi 6, 7 threads synchronization in ActiveX controls