最近项目中需要变写一个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刷新后倒是可以连上,但是过一会又会出问题。
这个东西快把我逼疯了,求各位大神指点。

解决方案 »

  1.   

    我又试了一下,用非ACITVEX程序调用的时候,单纯调用这个DLL是没有问题的,但是加上数据库控件或者另一个DLL的时候就出错了
      

  2.   

    DLL中的全局变量是每个DLL都复制一份的,各个DLL之间以及DLL与主程序之间不能直接进行
    数据共享。这也就是说主程序的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