如何使用winapis将字符串作为参数传递给C++字符串
问题描述:
使用SendMessageW函数我将c#字符串作为参数传递给C++函数。我在C++中对CString进行类型转换,但是它的值是空的。请检查以下代码并提供解决方案如何使用winapis将字符串作为参数传递给C++字符串
----------------------- c#code -------------- ----
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值为空。
答
您似乎在滥用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' – user1915370
你知道如何做到这一点。你的答案中有代码。将'lParam'转换为'wchar_t *'。用'(wchar_t *)lParam'。或'reinterpret_cast)(lParam)'。你不需要'CString'来调用'MessageBoxW'。 –
他应该可以使用'CString s =(const wchar_t *)lParam;'?虽然它是没有必要的,除非你需要使用'CString'做一些字符串格式化' –