在DLL中调用activex控件,并且调用者使用多线程调用,总结。(0)

Y

ybbqy

Unregistered / Unconfirmed
GUEST, unregistred user!
这几天有个项目需要使用AT指令,通过串口操作STK菜单接收短信,进行空中冲值操作,将mscomm32控件封装到DLL中被人调用,其中出现很多问题,以下是关于DLL,ACTIVEX,多线程的总结:1.dll中尽量加ShareMem单元,尽管导出函数中是纯C规范 遇到一种 情况,调用者为多线程调用时,在函数中只是TStringList.create与free,并且使用finally与except包含时会崩溃,去掉finally与except包含不会崩溃,问题很奇怪,在DLL中添加ShareMem单元后解决。2.CoInitialize(nil)为单线程 CoInitialize(nil)默认是COINIT_APARTMENTTHREADED,调用同一COM组件是串行化的。最直观的是如果COM组件的操作会耗费很多的时间,那看起来就是单线程。(mscomm32控件监 听串口结果如果,是否存在普遍性还需要验证)3.不要在initialization中调用CoInitialize/CoInitializeEx 不要在initialization中调用CoInitialize/CoInitializeEx,那样会导至其它程序LoadLibrary失败,具体原因还有待进一步调查,请不明真相的群众继续等待~如果在DLL中使用了COM组件一定需要调用的话,请在导出函数最开始处调用,并使用finally包含。
 
顶部