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在次執行緒和在QCoreApplication時com 元件沒能被初始化
按照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元件的三大介面: IUnknown、IClassFactory、IDispatchhttp://blog.csdn.net/weiwangchao_/article/details/6949264
在QT中使用ActiveX控制元件
http://blog.csdn.net/tingsking18/article/details/5403038
特別感謝以上部落格的作者.