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