Qt非托管C++;类与C#.Net一起工作
我现在需要帮助。如果有人能帮助我们“传输”我的基于QT的代码以使用我的C#应用程序,我将不胜感激 假设我有一个简单的QT类: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
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函数时,它就会被找到