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

Posted

技术标签:

【中文标题】当我们使用winapis将字符串作为参数传递时,如何将c#字符串转换为c++字符串【英文标题】:How to convert c# string to c++ string when we pass string as parameter using winapis 【发布时间】:2015-10-21 06:14:39 【问题描述】:

使用 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 值是空的。

【问题讨论】:

【参考方案1】:

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

CString 是一个 C++ 类。它与BSTR 二进制不兼容。

我个人会在 C# 中使用 Marshal.StringToCoTaskMemUni 并在 C++ 中转换为 wchar_t*。当SendMessageW 返回时,请记住在使用后销毁非托管内存,方法是调用Marshal.FreeCoTaskMem

【讨论】:

我正在发送自定义消息来代替 TVM_GETITEMHEIGHT。我是 c++ 新手,我在 c# 中使用过 Marshal.StringToUni,但我不知道如何将“LPARAM”转换为“wchar_t*”和“CString”你能告诉 c++ 代码将“LPARAM”转换为“CString”吗? /跨度> 你知道怎么做。您的答案中有代码。将lParam 转换为wchar_t*。与(wchar_t*)lParam。或reinterpret_cast<wchar_t*>)(lParam)。你不需要CString 来调用MessageBoxW 他应该可以使用CString s = (const wchar_t*)lParam;?虽然没有必要,除非您需要使用 CString 进行一些字符串格式化 我已经尝试了这三个,但是 MessageBox 中的消息是 empty.c# 代码是 'IntPtr bn = Marshal.StringToCoTaskMemUni("passingstring");' --- 'SendMessageW(utilityHandle, Win32Utilities.RegisterWindowMessage("requiredcontrol"), handle,bn )' --- Marshal.FreeCoTaskMem(bn);-----在 C++ 中:wchar_t* cvb = reinterpret_cast( l 参数); ----- MessageBox(NULL,cvb,L"stringvalue",NULL); ------ 这里 cvb 值为空。我在这里有什么遗漏吗? 你把C#代码改成调用StringToCoTaskMemUni?

以上是关于当我们使用winapis将字符串作为参数传递时,如何将c#字符串转换为c++字符串的主要内容,如果未能解决你的问题,请参考以下文章

当无效字符串作为参数传递时,如何确保 posix_time_zone 构造函数不会崩溃

当我将一个标记作为角度5中的参数传递时,无法匹配任何路径

当我们将对象作为参数传递给方法时,为啥会调用复制构造函数?

为啥我们不能将字符串作为模板参数传递?

WinAPI 中的 sz 和 pwsz 前缀

将React函数式组件作为函数的参数传递时,我应该如何用TS声明函数参数类型