2012-07-31 45 views
2

我現在需要一些幫助。如果有人能夠幫助我們「轉移」我的基於QT的代碼以與我的C#應用​​程序一起工作,我很樂意。Qt非託管C++類與C#.Net工作

可以說我有這個簡單的QT類:

class ItShouldWork : public QObject 
{ 
    Q_OBJECT 

public: 
    ItShouldWork(QObject* parent = 0) : QObject(parent){} 
    QString id() const { return objectName(); } 

}; 

現在我希望能夠與Visual Studio C#來訪問這個類,我試圖創建通過包裝的非託管的DLL和訪問,試圖創建一個COM組件,但現在我完全卡住了,所以我回到這個簡單的類的開頭。我已經看到了你可以使用一個外部的「C」與__declspec(dllexport)的是這樣的:

extern "C" __declspec(dllexport) double Subtract(double a, double b) 

,然後在.NET中使用_dllImport,這正常工作與上面的功能,但例如爲QString添加時它不承認我的dll,並引發dllNotFoundException。

然後,我想也許你需要某種包裝,是的,你怎麼做,然後..?用google搜索,但沒有真正幫助我用c + +和qt函數。

如何創建一個dll和一個c-wrapper或創建一個COM組件直接一步一步就會很棒,我並不在意它是如何完成的,但如果你知道一個方法,請幫助我一個小教程?我要瘋了...

+0

'QString'是'QT'框架獨有的。你將不得不寫w包裝接近轉換'QString'類到一個正常的'字符串' – 2012-07-31 16:43:16

+0

@Rambound你能幫助我們如何做到這一點?我的意思是包裝,如何將QString轉換爲char *應該不是問題。 – 2012-08-01 11:46:08

回答

2

C++/CLI是我想要的方式。 請參閱:Wrapping unmanaged C++ with C++/CLI - a proper approach

,尤其是:http://www.delmarlearning.com/companions/content/1592009638/bonus/009638_BonusCh02.pdf

走進深入這個主題是不容易在一個論壇帖子的事。但通過一些研究,您應該能夠快速創建可用的東西。 如果你來自C/C++,C++/CLI需要一些習慣。這有點限制,特別是混合託管類型和非託管類型。但是文學將在那裏引導你。

編輯: 針對OP的給我的答案評論(另見Ramhound,我評論),下面是一個例子,我得到了here: 看一看鏈接後面的內容看m_impl的情況下。 ..

String^CSimpleObjectWrapper::ToString(void) 
{ 
    wchar_t szStr[100]; 
    HRESULT hr = m_impl->ToString(szStr, ARRAYSIZE(szStr)); 
    if (FAILED(hr)) 
    { 
     Marshal::ThrowExceptionForHR(hr); 
    } 
    // Marshal PWSTR to System::String and return it. 
    return gcnew String(szStr); 
} 

編輯2: 還取決於所期望的深度/複雜性/包裝器的能力,你可能會想你的包裹中的類C++/CLI「引用類」上課,而不是使用的DllImport。

+0

我查看了您的鏈接,並且我想我對這些工作如何工作有了更多瞭解。如果我使用C++/CLI解決方案,我會遇到另一個問題,就是__declspec(dllexport)如何與QT變量一起使用,例如此函數:__declspec(dllexport)QString getId(); 當試圖通過DllImport訪問它時,它總是說dllNotFoundException,然後當我刪除它並且只有普通的C函數時,它就像它應該發現的一樣。 – 2012-08-01 11:38:33

+0

那麼,假設「__declspec(dllexport)QString getId();」是一個函數包裝,你正在導出: 在我看來,你必須將QString轉換爲函數包裝中的另一個字符串類型。否則,你會遇到像你提到的問題,以及(可能)編組地獄:) – 2012-08-01 13:00:07

+0

請注意,單聲道不支持C++/CLI,因此使用它的任何解決方案都不是跨平臺的。 – trampster 2013-10-10 20:13:32

1

您可以在託管C++上創建包裝。那麼你將能夠在C#中使用託管類。檢查它,它可能會幫助你http://msdn.microsoft.com/en-us/library/ms235638.aspx

+0

答案不錯,雖然不推薦使用Managed C++。 – 2012-07-31 16:43:54

+0

爲什麼託管C++會被棄用?資源? – tobsen 2012-08-01 13:40:47

+2

@tobsen好,縮寫expr。託管C++代表「託管擴展C++」。這絕對不贊成,請參閱[這裏,第一句](http://en.wikipedia.org/wiki/Managed_Extensions_for_C%2B%2B)和[也在這裏,刪除了對VS的支持](http://msdn.microsoft.com /en-us/library/b23b94s7(v=vs.90).aspx)。目前的標準是ECMA批准的C++/CLI。另請參閱[Bjarne Stroustup的網站](http://www.stroustrup.com/bs_faq.html#CppCLI)。 – 2012-08-01 16:30:12

1

看看http://doc.qt.nokia.com/4.7-snapshot/activeqt-dotnet.html。它使用ActiveQt可,一些資料,每個網站:

Qt的ActiveX和COM支持允許的Qt爲Windows開發者: 訪問和使用ActiveX控件和任何 的ActiveX服務器在他們的Qt應用程序提供的COM對象。使他們的Qt應用程序作爲COM服務器可用,其中包含任意數量的Qt對象和小部件,如 COM對象和ActiveX控件。

該頁面還提供了有關如何與.Net集成的示例。

+0

謝謝,這個頁面幫助了我很多,現在我已經成功創建了一個com組件。 – 2012-08-07 07:35:00

+0

@SimonNielsen很高興幫助。如果這些帖子中的任何一個回答了您的問題,請將其標記爲已回答,以便具有相同問題的下一個人員可以找到適當的答案。這也是一個很好的禮儀upvote任何答案,提供有用的信息或替代答案你的問題。 – 2012-08-07 11:18:23