Qt非托管C++类以使用C#网

Qt unmanaged C++ class to work with C# .Net

本文关键字:C++ Qt      更新时间:2023-10-16

我现在需要一些帮助。如果有人能帮助我们"转移"我基于QT的代码来使用我的C#应用程序,我会很高兴。

假设我有一个简单的QT类:

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

现在我想能够用Visual Studio C#访问这个类,我尝试过创建一个非托管dll并通过包装进行访问,尝试过创建COM组件,但现在我完全陷入了困境,所以我要回到这个简单类的开头。我已经看到,您可以使用带有__declspec(dllexport)的外部"C",如下所示:

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

然后在.net中使用_dllImport,这与上面的函数配合使用很好,但当向其中添加例如QString时,它不再识别我的dll,并引发dllNotFoundException。

然后我想也许你需要某种包装,是的,那么你是怎么做到的。。?谷歌搜索了一下,但对我的c++和qt函数没有任何帮助。

一步一步地介绍如何创建dll和c包装器或直接创建COM组件dll将是很棒的,我真的不在乎它是如何完成的,但如果你知道一种方法,请帮我做一个小教程?我快疯了。。。

我认为,

C++/CLI是最好的选择。请参阅:用C++/CLI包装非托管C++-一种正确的方法

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

在论坛帖子中深入探讨这个话题并不容易。但通过一些研究,你应该能够很快创造出可用的东西。如果您来自C/C++,那么C++/CLI需要一些时间来适应。它的限制性更强,尤其是在混合托管和非托管类型方面。但文学会引导你去那里。

编辑:针对OP对我的回答的评论(另请参阅Ramhound的评论,我),以下是我在这里得到的一个例子:请查看链接后面的内容,以查看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"ref class"es包装类,而不是使用DllImport。

您可以在托管C++上创建包装器。然后您将能够在c#中使用托管类。检查一下,它可能会对你有所帮助http://msdn.microsoft.com/en-us/library/ms235638.aspx

看看http://doc.qt.nokia.com/4.7-snapshot/activeqt-dotnet.html.它有一些关于使用ActiveQT的信息,根据网站:

Qt的ActiveX和COM支持使Qt for Windows开发人员能够:访问和使用任何ActiveX服务器在他们的Qt应用程序中。制作他们的Qt应用程序可用作COM服务器,具有任意数量的Qt对象和小部件COM对象和ActiveX控件。

该页面还提供了有关如何与集成的示例。网