2015-10-21 1 views
0

Использование функции SendMessageW Я передаю строку C# как параметр функции C++. Я приписываю CString в C++, но значение пусто. Пожалуйста, проверьте ниже код и предоставьте решениеКак преобразовать строку C# в строку C++ при передаче строки в качестве параметра с помощью winapis

----------------------- 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.

Лично я использовал бы Marshal.StringToCoTaskMemUni в C# и отбрасывал до wchar_t* в C++. Не забывайте уничтожать неуправляемую память после того, как вы ее использовали, когда SendMessageW возвращает, вызывая Marshal.FreeCoTaskMem.

+0

Я посылаю пользовательское сообщение вместо TVM_GETITEMHEIGHT. Я новичок в C++. Я использовал Marshal.StringToUni в C#, но я не знаю, как преобразовать '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' –

Смежные вопросы