2012-02-10 115 views
0

我們有一組使用C++編寫的用於Windows的C++應用程序所使用的DLL,所有這些都封裝在Visual Studio解決方案中。現在有人將DLL移植到Qt中,以便可以在其他操作系統上使用它們。我可以在我的解決方案中切換到Qt代碼並繼續使用C#應用程序嗎?或者我將不得不分裂成兩個解決方案?我可以在Visual Studio 2010中混合使用Qt和非Qt項目嗎?

我試着已經這樣做了,但是當我嘗試建立我得到

錯誤「的操作無法完成,該參數不正確」

「無法執行請求的操作,因爲內置已在 進度中」

僅供參考,我在VS2010中使用Qt V4.8.0預編譯的二進制文件。

回答

0

事實證明,當我的同事完成Qt端口時,他重新創建了一些Visual Studio項目文件,這導致它們對原始文件有不同的GUID。當我切換到Qt端口時,GUID與C#項目列爲依賴關係的內容不匹配。 Visual Studio在處理這個問題(或者告訴你)方面有點過分,所以你會得到上面列出的錯誤。

一旦我們解決這個問題,構建工作正常,但運行它並沒有做任何事情 - C++ DLL從來沒有響應過。最終我意識到,爲了Qt定時器和隊列的工作,我們不得不在DLL中調用QCoreApplication,因爲我們沒有使用Qt UI。但是,由於有一些Qt UI使用相同的DLL,所以如果UI已經調用了QApplication,我們不能總是調用QCoreApplication。您可以使用QCoreApplication :: instance()來檢查是否需要調用,但是您無法在DLL_PROCESS_ATTACH的DllMain()中執行此操作,因爲首先它太早,其次是Windows特定。所以我們想出了這個:

static struct Vars 
{ 
    QCoreApplication *l_pQt; 
    bool    l_bQtCoreCreated; 

    Vars() 
     : l_pQt(NULL), l_bQtCoreCreated(false) 
    { 
    } 

    virtual ~Vars() 
    { 
     if (l_pQt != NULL) 
     { 
      if (l_bQtCoreCreated) 
      { 
       delete l_pQt; 
      } 
      l_pQt = NULL; 
      l_bQtCoreCreated = false; 
     } 
    } 
} g_private; 


static void InitQtCore(void) 
{ 
    if (g_private.l_pQt == NULL) 
    { 
     g_private.l_pQt = QCoreApplication::instance(); 
     if (g_private.l_pQt == NULL) 
     { 
      g_private.l_bQtCoreCreated = true; 
      int argc = 0; 
      char *argv = NULL; 
      g_private.l_pQt = new QCoreApplication(argc, &argv); 
     } 
    } 
} 

在DLL中的任何功能不僅僅是基本設置在開始調用InitQtCore()。這適用於Qt和非Qt UI(C#和C++)。

0

我們有一個C++項目,包括用Qt構建的DLL和不知道Qt的DLL。這在VS2010中可以很好地構建,但我們並沒有使用qmake來構建Qt項目;它一直是MSBUILD,我們必須專門運行qmake「神奇地」作爲構建的一部分運行的某些可執行文件(如moc)。

也就是說,可能會有細微的差異,因爲我們正在基於商業代碼構建自己的一組二進制文件,而不是使用預構建的二進制文件。

相關問題