2015-10-21 224 views
0

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

回答

3

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

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

就我个人而言,我会在C#中使用Marshal.StringToCoTaskMemUni,并在C++中将其转换为wchar_t*。请记住在SendMessageW返回时通过调用Marshal.FreeCoTaskMem来销毁非托管内存。

+0

我正在发送自定义消息来代替TVM_GETITEMHEIGHT。我是C++的新手我已经在c#中使用Marshal.StringToUni,但我不知道如何将'LPARAM'转换为'wchar_t *'和'CString'你能告诉C++代码将'LPARAM'转换为'CString' – user1915370

+0

你知道如何做到这一点。你的答案中有代码。将'lParam'转换为'wchar_t *'。用'(wchar_t *)lParam'。或'reinterpret_cast )(lParam)'。你不需要'CString'来调用'MessageBoxW'。 –

+0

他应该可以使用'CString s =(const wchar_t *)lParam;'?虽然它是没有必要的,除非你需要使用'CString'做一些字符串格式化' –

相关问题