2012-07-31 102 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