当我们使用winapis传递字符串作为参数时,如何将c#字符串转换为c++字符串

本文关键字:字符串 c++ 转换 参数 winapis 我们 | 更新日期: 2023-09-27 18:18:46

使用SendMessageW函数,我将c#字符串作为参数传递给c++函数。我在c++中转换为CString,但它的值是空的。请检查下面的代码并提供解决方案

----------------------- c#代码 ------------------

public unsafe IntPtr Testing()
{
  string string_aux = "Stringtochange";
  void* pt = Marshal.StringToBSTR(string_aux).ToPointer();
  IntPtr ab = new IntPtr(pt);
  return ab;
}
public void GetValue()  
{
   SendMessageW(utilityHandle1, TVM_GETITEMHEIGHT, handle,Testing());
}

--------------------- c++代码 --------------

CString *st = (CString*)lParam;
MessageBox(NULL,*st,L"stringvalue",NULL);

这里*st值为空。

当我们使用winapis传递字符串作为参数时,如何将c#字符串转换为c++字符串

你似乎在滥用TVM_GETITEMHEIGHT。为什么不使用自定义消息呢?

CString是c++类。它不是二进制兼容的BSTR

我个人会在c#中使用Marshal.StringToCoTaskMemUni,在c++中转换为wchar_t*。记住,在使用了非托管内存之后,当SendMessageW返回时,通过调用Marshal.FreeCoTaskMem来销毁它。