1. 程式人生 > >Windows下Qt5.2 使用COM元件操作 Execl

Windows下Qt5.2 使用COM元件操作 Execl

這兩天使用QT編寫程式,需要用到操作和讀取Execl檔案。學習了它的平臺相關特性。

Qt提供了與平臺相關的程式設計介面,對於windows系統Qt提供了ActiveQt框架。

ActiveQt有兩個模組組成

QAxContainer模組允許我們使用COM物件並且可以在QT應用程式中嵌入ActiveX控制元件。

QAxServer模組允許我們匯出使用Qt編寫的自定義的COM物件和ActiveX控制元件

操作Execl要使用QAxContainer模組:

該模組的抽象基類QAxBase,是最主要的功能類,QAxObject  QAxSelect  QAxWidgetd等類都是繼承於它。其主要介面和說明參見:

工程中使用的是 QCoreApplication 

在編譯執行是提示:

 

CoCreateInstance  failure <尚未呼叫CoInitializ> 

QAxBase::setControl: request  control Execl.Application  could not be initialized

QAxBase::dynamicCallHelper:Object is not Initialized, or initiallised failed 

意思是未初始化COM元件

經查閱後, QT在次執行緒和在QCoreApplicationcom 元件沒能被初始化

按照QAxBase類的說明,在呼叫setControl 和 control 是會初始化COM元件,但經過測試,問題依舊沒有解決,只是在終端多打了一行與上述同樣的錯誤提示。

解決辦法: 

  在QT中直接呼叫windows系統的API 初始化COM元件.

  加上標頭檔案 #include <windows.h>

  在軟體中呼叫windows的API函式:

  HRESULT r = OleInitialize(0);

或者

HRESULT r = CoInitializeEx(NULL,COINIT_MULTITHREADED);

if (r != S_OK && r != S_FALSE)

{

qWarning("Qt:初始化Ole失敗(error %x",(unsigned int)r);

}

經過編譯測試,解決了未初始化COM元件的問題。

關於windows的COM元件問題參閱如下部落格:

OleInitialize、CoInitialize、CoInitializeEx和AfxOleInit()區別

http://blog.sina.com.cn/s/blog_8a7012cf01014aot.html  

COM元件的三大介面: IUnknownIClassFactoryIDispatch

http://blog.csdn.net/weiwangchao_/article/details/6949264

在QT中使用ActiveX控制元件

http://blog.csdn.net/tingsking18/article/details/5403038

特別感謝以上部落格的作者.