Преобразование LPCWSTR с WideCharToMultiByte. Нужна помощь - PullRequest
0 голосов
/ 02 марта 2009

У меня есть такая функция:

BOOL WINAPI MyFunction(HDC hdc, LPCWSTR text, UINT cbCount){

char AnsiBuffer[255];
int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 0, NULL, NULL);
if(written > -1) AnsiBuffer[written] = '\0';

if(written>0){

    ofstream myfile;
    myfile.open ("C:\\example.txt", ios::app);
    myfile.write(AnsiBuffer, sizeof(AnsiBuffer));
    myfile.write("\n", 1);
    myfile.close();

}


....

Когда я отображаю входной текст LPCWSTR с помощью MessageBoxW (), текст отображается нормально. Когда я пытаюсь преобразовать его в многобайтовый код, возвращаемое значение выглядит нормально (например, 22, 45 и т. Д.), Но в результате получаются строки из тарабарщины (например, ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ). Предложения?

Ответы [ 2 ]

2 голосов
/ 02 марта 2009

Я вижу две проблемы;

1) Вы передаете '0' в WideCharToMultiByte для размера многобайтового буфера. Если вы читаете документы, это приводит к тому, что функция возвращает НОМЕР необходимых байтов, но не выполняет фактическое преобразование. (Это позволит вам впоследствии выделить буфер правильного размера и вызвать функцию).

2) в file.write sizeof (AnsiBuffer) приведет к записи 255 байт независимо от того, что находится в буфере sizeof - это вычисление времени компиляции, которое возвращает размер переменной. Вы должны заменить это на «записанную» переменную, которая представляет длину строки.

1 голос
/ 02 марта 2009

Вам нужно передать длину буфера в API вместо передачи 0. Когда вы передаете 0, функция возвращает требуемую длину буфера, но не записывает в нее. Вы видите результаты неинициализированного массива.

Вот правильный звонок, с 255 в нужном месте:

int written = WideCharToMultiByte(CP_ACP, 0, text, cbCount, AnsiBuffer , 255, NULL, NULL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...