Как преобразовать CString в Windows API и пользовательские функции, которые используют WCHAR? - PullRequest
0 голосов
/ 09 июля 2019

Итак, в моем коде C ++ есть тысячи функций, которые принимают в качестве параметра, например:

void SomeFunction(WCHAR *sSomeStringIn)
    {
    ...
    }

А внутри функции он вызывает API-интерфейсы Windows, такие как:

GetWindowsText(...)

Как мне отправить CString INTO в мою пользовательскую функцию ? Во-вторых, затем преобразуйте входящий WCHAR в CString в SomeFunction, чтобы я мог передать WCHAR в GetWindowsText?

Трудно сделать calloc (), а затем free () везде и найти утечки!

Я ищу советы и рекомендации по использованию существующего кода WCHAR и как (медленно) конвертировать в CString. Я не могу переписать сотни тысяч строк кода одновременно (очевидно), чтобы конвертировать все в CString.

Или ... я должен использовать другой код обработки строк, кроме CString?

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

CString по умолчанию соответствует WCHAR, если ваш проект построен с набором символов Unicode .
Итак, чтобы вызвать Windows API, вам ничего не нужно делать, просто передайте CString как есть. Потому что CString имеет встроенный operator LPCWSTR.

CString str;
str = L"My message";
MessageBox(str);

Для GetWindowText

WCHAR buff[256];
GetWindowText(buff, 256);
CString str = buff;

или даже так:

CString str;
str.Preallocate(256);
GetWindowText(str.GetBuffer(), 256);

Конечно, если ваш проект собран с MBCS (не в Unicode), вам придется постоянно конвертировать из char* в WCHAR* и обратно, что является головной болью.

2 голосов
/ 09 июля 2019

Избегайте использования различных типов строк в программе, если это неизбежно, напишите оболочку для преобразования всех других типов строк в тип строки программы по умолчанию, чтобы избежать путаницы в кодах.Для окон вы можете придерживаться только CString.Попробуйте это вспомогательные функции:

CString convertToCString(WCHAR *sSomeStringIn)
{
    return CString(sSomeStringIn);
}

const WCHAR *convertTowchar(const CString& s)
{
    return  s.GetString();
}

int main(int argc, char* argv[])
{
    WCHAR wch[10] = L"Hello";
    CString  s = convertToCString(wch);

    CString s2 = L"World";
    WCHAR wch2[10];
    wcscpy(wch2, convertTowchar(s2));
}
...