2014-01-21 23 views
3

Qt的使用Qt庫是偉大的建築應用,但一次或兩次,我一直想顯示來自現有的應用程序一個很好的Qt對話框,是用純C.從C程序

我想描述如何創建一個基於Qt的共享或靜態庫,可供Qt-unaware程序使用。爲了縮小這個問題,讓我們假設我們調用一個顯示一些對話框或者小部件的函數,並且在所有對話框關閉之前不會返回。否則,如果沒有主機進程的某種「合作」,就無法完成 - 它必須至少爲Qt運行消息泵。

在本例中,我將使用Windows程序rundll32.exe加載並執行一個顯示Qt about對話框的函數。

回答

2

假設我們的DLL叫做MyQtBasedDll.dll,它有一個導出的函數 - void MyEntryPoint()

我們將使用命令行rundll32.exe MyQtBasedDll.dll,MyEntryPoint來運行它。請注意,您需要爲exe和dll提供完整路徑。

爲了使rundll32.exe加載和使用該程序,MyEntryPoint()應該有一個C調用約定。此外,我們需要一個QApplication實例來完成任何GUI工作,而rundll32.exe顯然不會爲我們創建它。

要創建Qt庫與Qt Creator中,我們可以選擇文件 - >新建文件或項目 - > Libraries-> C++庫,項目名稱應該是MyQtBasedDll

MyEntryPoint()函數的代碼非常簡單:

extern "C" 
{ 
__declspec(dllexport) void MyEntryPoint() 
{ 
    if (!QApplication::instance()) { 
     QApplication a(__argc, __argv); 
     QMessageBox::aboutQt(0); 
    } else { 
     QMessageBox::aboutQt(0); 
    } 
} 
} 

該功能可以由相同的exe被調用多次,並且每一次一個新QApplication對象被構造,只對功能的持續時間。請注意,我們檢查現有的實例,以便我們的DLL即使在被Qt應用程序調用時也能工作。

現在,您只需用您的功能代替QMessageBox::aboutQt(0);即可完成有用的功能!

+1

這是一個真正的問題,或者現在是這樣的博客 – Brandin

+3

@Brandin「分享你的知識,問答風格」 - 有一個選項,你不知道嗎?此外,在[博客](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/)工作人員說 - *要清澈透明,要求和回答你自己的問題不僅僅是可以的,它是明確鼓勵的。* – sashoalm