这个问题困扰了我很久了,一直没有弄清楚原因 环境:Win Vista + VS2008 + QT4.5.2 利用QAxObject封装了一个第三方COM组件,在主线程使用没问题,每一个函数都能被正确调用,问题是我把这个封装的组件放在一个继承自QThread的子类中以后,COM中的所有函数在run函数中都无法被成功调用了,提示 "First-chance exception at 0x77ae42eb in myapp.exe: 0x800401F0: CoInitialize was not called." 从意思上看,应该是组件没有被初始化。事实上在我的QThread子类的构造函数中已经成功地创建了该对象,当然,QThread子类的实例是在主线程中创建的,不知道这个会不会对COM的实例有影响。也曾尝试在QThread子类的run函数中创建由QAxObject封装的COM组件的实例,但问题仍然得不到解决。 之前似曾在哪里看到过,似乎因为权限的原因,好像COM组件要在自身的线程内创建,并调用CoInitialize(NULL, MULI_THREAD)(希望参数是正确的)之类的函数,但是对于QAxObject来讲,好像这些调用都已经封装好了,在我的QAxObject子类的构造函数中主要是调用了setControl(QString)函数载入COM的(见文档)。不知道对于子线程还需要做什么?一
dbzhang800
2010-08-11 07:37
我对COM不了解(接近一窍不通),谈下自己的认识,仅供参考
1. 使用 COM 的过程: a. CoInitialize(NULL) b. CoCreateInstance(....) c. CoUnInitialize()
2. 当使用 QAppplicaton 时: a 和 c 由 QApplication 自动完成了 (似乎是因为它本身需要用到COM) b 由 setControl 或 QAxObject 的构造函数完成(这个不用说)