不同语言间数据的传递是很频繁的,尤其是字符串。开发需要,本人想要传递QString的字符串给C#的dll使用。
找了半天,其实有很多高深的技巧,可惜本人对com的本质不太了解,也不熟悉C#的各种数据类型。所以说,有时间,一定要多看看书才行,只会基操,干啥都很麻烦。虽然想过很多绕道的方法,比如看看能不能共享内存,或者用socket来传递数据等,但是太绕了,简单的事情显得很麻烦。弄了老久,还是有几篇值得参考的博客:
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);