Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt非托管C++;类与C#.Net一起工作_C#_C++_Dll_Com Interop - Fatal编程技术网

Qt非托管C++;类与C#.Net一起工作

Qt非托管C++;类与C#.Net一起工作,c#,c++,dll,com-interop,C#,C++,Dll,Com Interop,我现在需要帮助。如果有人能帮助我们“传输”我的基于QT的代码以使用我的C#应用程序,我将不胜感激 假设我有一个简单的QT类: class ItShouldWork : public QObject { Q_OBJECT public: ItShouldWork(QObject* parent = 0) : QObject(parent){} QString id() const { return objectName(); } }; 现在我想用Visual Stud

我现在需要帮助。如果有人能帮助我们“传输”我的基于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组件,但现在我完全被卡住了,所以我要回到这个简单类的开头。我已经看到,可以将extern“C”与u declspec(dllexport)一起使用,如下所示:

extern "C" __declspec(dllexport) double Subtract(double a, double b)
然后在.net中使用_dllImport,这与上面的函数配合很好,但是当向其中添加一个QString时,它将不再识别我的dll,并引发dllNotFoundException

然后我想也许你需要某种包装,是的,那你怎么做。。?Google离开了,但没有什么真正帮助我的C++和Qt函数。
一小步一小步地介绍如何创建dll和c包装器或直接创建COM组件dll将是非常棒的,我真的不在乎它是如何完成的,但如果你知道一种方法,请帮助我编写一个小教程?我快疯了

< P>可以在托管C++上创建包装器。然后您将能够在c#中使用托管类。检查一下,这可能有助于你

你可以在托管C++上创建包装器。然后您将能够在c#中使用托管类。检查这个,它可能会对您有所帮助,我认为C++/CLI是一个不错的选择。 见:

特别是:

在论坛帖子中深入探讨这一主题并不容易。但是通过一些研究,你应该能够很快创造出一些有用的东西。 如果您来自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”来包装类,而不是使用DllImport。

C++/CLI是一种可行的方法。 见:

特别是:

在论坛帖子中深入探讨这一主题并不容易。但是通过一些研究,你应该能够很快创造出一些有用的东西。 如果您来自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”来包装类,而不是使用DllImport。

看一看。它有一些关于使用ActiveQT的信息,根据网站:

Qt的ActiveX和COM支持允许Windows开发人员使用Qt: 访问和使用由任何 ActiveX服务器在他们的Qt应用程序中。制作他们的Qt应用程序 作为COM服务器提供,任何数量的Qt对象和小部件都可以作为 COM对象和ActiveX控件

该页面还提供了如何与.Net集成的示例

看一看。它有一些关于使用ActiveQT的信息,根据网站:

Qt的ActiveX和COM支持允许Windows开发人员使用Qt: 访问和使用由任何 ActiveX服务器在他们的Qt应用程序中。制作他们的Qt应用程序 作为COM服务器提供,任何数量的Qt对象和小部件都可以作为 COM对象和ActiveX控件


该页面还提供了如何与.Net集成的示例

QString
QT
框架所独有的。您必须编写w wrapper close才能将
QString
类转换为正常的
字符串
@Rambound您能帮我们做些什么吗?包装器我的意思是,如何将QString转换为char*应该不是问题。
QString
QT
框架所独有的。您必须编写w wrapper close才能将
QString
类转换为正常的
字符串
@Rambound您能帮我们做些什么吗?包装器我的意思是,如何将QString转换为char*应该不是问题。我查看了您的链接,我想我对这些东西的工作原理有了更多的了解。如果我使用C++/CLI解决方案,我会遇到另一个问题,那就是u declspec(dllexport)如何与QT变量一起工作,例如这个函数:u declspec(dllexport)QString getId();当试图通过DllImport访问它时,它总是说dllNotFoundException,然后当我删除它并且只有普通的C函数时,它就会被找到。好吧,假设“u declspec(dllexport)QString getId();”是一个函数包装器,您正在导出的:在我看来,您必须在函数包装器中将QString转换为另一种字符串类型。否则,您将遇到您提到的问题,以及(可能)编组地狱:)请注意,mono不支持c++/CLI,因此任何使用它的解决方案都不是跨平台的。我查看了您的链接,我想我对这些东西的工作原理有了更多的了解。如果我使用C++/CLI解决方案,我会遇到另一个问题,那就是u declspec(dllexport)如何与QT变量一起工作,例如这个函数:u declspec(dllexport)QString getId();当试图通过DllImport访问它时,它总是说dllNotFoundException,然后当我删除它并且只使用普通的C函数时,它就会被找到