2015-10-21 225 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'做一些字符串格式化' –

相關問題