Qt中QString传送给C#的dll

不同语言间数据的传递是很频繁的,尤其是字符串。开发需要,本人想要传递QString的字符串给C#的dll使用。

找了半天,其实有很多高深的技巧,可惜本人对com的本质不太了解,也不熟悉C#的各种数据类型。所以说,有时间,一定要多看看书才行,只会基操,干啥都很麻烦。虽然想过很多绕道的方法,比如看看能不能共享内存,或者用socket来传递数据等,但是太绕了,简单的事情显得很麻烦。弄了老久,还是有几篇值得参考的博客:

https://blog.csdn.net/weixin_30757793/article/details/95638466 涉及指针的转换,相信以后会用得上的。

https://blog.csdn.net/w_s_q/article/details/5677493 这篇博客是正解,虽然不像其他问题,稍微改改,复制几行代码就能解决问题。但是写成这个样子,一看就知道是干货。

c#的dll代码

public static void Test2(string ch)
{
    Console.WriteLine(ch);
    return;
}

C++代码

A.h
using namespace System::Runtime::InteropServices;	
System::String^ UnmanagedStringA2ManagedString(char *pIn);//不能作为类的成员函数
class A{
	
}

A.cpp
//本来应该using namespace System,但是类里面已经有String类型了,所以只能在类型前面加入System::
System::String^ UnmanagedStringA2ManagedString(char *pIn)
{
    System::String^ strOut = Marshal::PtrToStringAnsi(static_cast<System::IntPtr>(pIn));	//IntPtr也是C#里面System::的
    return strOut;
}
void Widget::on_m_start_clicked()
{
    QString str = "hello";
    string s = str.toStdString();
    char data[] = "helloabcd";

    System::String ^str1, ^str2;
    str1 = UnmanagedStringA2ManagedString(data);

    Program::Test2(str1);
}
控制台输出:helloabcd
这里能传递char数组,显然,QString转换一下再传递也没有任何问题

修改后的:
QString str = "hello";
    string s = str.toStdString();
    char data[16];
    memset(data,0,16);
    std::cout<<s<<endl;
    memcpy(data,s.c_str(),s.length());
    System::String ^str1, ^str2;
    str1 = UnmanagedStringA2ManagedString(data);

    Program::Test2(str1);
posted @ 2023-01-06 18:58  念秋  阅读(225)  评论(0编辑  收藏  举报