Непонятности с UNICODE
От: roman10  
Дата: 17.11.05 10:07
Оценка:
Решил переделать проект в Unicode. Объявил в свойствах проекта UNICODE и _UNICODE. При компиляции ругается:

GetWindowText(m_hEditBox, szBuff, MAX_LENGTH);


error C2664: 'GetWindowTextA' : cannot convert parameter 2 from 'wchar_t [256]' to 'LPSTR'

Ладно, переделываю вот так:

#define UNICODE
#ifdef UNICODE
    GetWindowText(m_hEditBox, szBuff, SEARCH_TEXT_MAX_LENGTH);
#endif


Компилирую... И что же? Опять ругается на функцию GetWindowText. Что за чудеса, непонятно. Не подскажите, в чем может быть проблема? А то я даже не представляю, с какого боку зайти. А то не хотелось бы везде явно указывать вызов юникодовых версий функций.
Re: Непонятности с UNICODE
От: Privalov  
Дата: 17.11.05 10:12
Оценка:
Здравствуйте, roman10, Вы писали:

R>error C2664: 'GetWindowTextA' : cannot convert parameter 2 from 'wchar_t [256]' to 'LPSTR'


Объяви: LPTSTR szBuff;
Re[2]: Непонятности с UNICODE
От: Сергей Мухин Россия  
Дата: 17.11.05 10:27
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Здравствуйте, roman10, Вы писали:


R>>error C2664: 'GetWindowTextA' : cannot convert parameter 2 from 'wchar_t [256]' to 'LPSTR'


P>Объяви: LPTSTR szBuff;


видно же, что она объявлена

wchar_t szBuff[256];

проблема в том, что вызывается А ф-ия а не W.

где-то все таки пробивает на не UNICODE
поставь

#ifndef UNICODE
#error U
#endif
#ifndef _UNICODE
#error _U
#endif
---
С уважением,
Сергей Мухин
Re[2]: Непонятности с UNICODE
От: roman10  
Дата: 17.11.05 10:28
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Здравствуйте, roman10, Вы писали:


R>>error C2664: 'GetWindowTextA' : cannot convert parameter 2 from 'wchar_t [256]' to 'LPSTR'


P>Объяви: LPTSTR szBuff;


Это не совсем то, что нужно. Мне нужна юникодная строка, и, соотвественно, вызов функции GetWindowTextW. Непонятно, почему не смотря на объявление UNICODE, препроцессор все равно упорно подставляет ASCII версию...
Re: Непонятности с UNICODE
От: EyeOfHell  
Дата: 17.11.05 10:29
Оценка:
Windows API имеет для больщинства функций две версии, заканчивающиеся на литеры 'A' для ansi и 'W' для unicode (от 'wide char'). Отсутствие или наличие define UNICODE определяет, во что при компиляции превратится GetWindowText — в GetWindowTextA или GetWindowTextW. При этом, очевидно, GetWindowTextA принимает вторым аргументом char, а GetWindowTextW — wchar_t.

Чтобы проект нормально компилировался с W-версиями системных функций, передаваемые аргументы надо либо вручную задать правильно (wchar_t, WINDOWCLASSW итд.) либо использовать уже существующие define'ы, автоматически подставляющие нужные версии в зависимости от define UNICODE.

Для текстовых строк таким define будет TCHAR, который при наличиее define UNICODE превратиться в wchar_t , а при отсутствии — в char.

Таким образом:


TCHAR szBuf[1024];
const int c_nSize = sizeof(szBuf)/sizeof(szBuf[0]);
::GetWindowText(m_hEditBox, szBuf, c_nSize);
szBuf[c_nSize-1] = 0;



Или то же самое с указателем.

При использовании UNICODE надо везде аккуратно считать длину строк в символах, так как каждый символ уже 2 байта а не 1 как в ANSI. А то баги будут. Много .

С уважением, Око.
Re[2]: Непонятности с UNICODE
От: Сергей Мухин Россия  
Дата: 17.11.05 10:32
Оценка:
Здравствуйте, EyeOfHell, Вы писали:


EOH>При использовании UNICODE надо везде аккуратно считать длину строк в символах, так как каждый символ уже 2 байта а не 1 как в


вы хотели сказать длина строк в байтах? т.к. в символах "abc" и L"abc" занимает три символа
---
С уважением,
Сергей Мухин
Re[2]: Непонятности с UNICODE
От: EyeOfHell  
Дата: 17.11.05 10:33
Оценка:
Мои извинения, невнимательно прочитал вопрос .

У тебя где-то в файлах проекта явно задан #undef UNICODE или что-то похожее, приводящее к вызову не той функции. В том же файле, где вызывается GetWindowText , прямо перед #include <windows.h> поставь #define UNICODE

С уважением, Око
Re[3]: Непонятности с UNICODE
От: EyeOfHell  
Дата: 17.11.05 10:38
Оценка:
День добрый.

вы хотели сказать длина строк в байтах? т.к. в символах "abc" и L"abc" занимает три символа


Оффтоп:

const int c_nSize = 1024;
TCHAR *szBuf = ::malloc(c_nSize);
::GetWindowText(hWnd, szBuf, c_nSize);
szBuf[c_nSize-1] = 0;

и

const int c_nSize = 1024;
TCHAR *szBuf = ::malloc(c_nSize);
const int c_nChars = c_nSize/sizeof(TCHAR);
::GetWindowText(hWnd, szBuf, c_nChars);
szBuf[c_nChars-1] = 0;



Конечно, надо в обе стороны правильно считать, но в эту сторону оно особенно много багов дает

С уважением, Око
Re[3]: Непонятности с UNICODE
От: roman10  
Дата: 17.11.05 11:05
Оценка:
Здравствуйте, EyeOfHell, Вы писали:

EOH>Мои извинения, невнимательно прочитал вопрос .


EOH>У тебя где-то в файлах проекта явно задан #undef UNICODE или что-то похожее, приводящее к вызову не той функции. В том же файле, где вызывается GetWindowText , прямо перед #include <windows.h> поставь #define UNICODE


EOH>С уважением, Око



Благодарю, я так и поступил: поставил в начало stdafx.h и все вроде скомпилилось . Только я так и не понял, где может стоять #undef. В моем коде его нет. Может конечно где-то в недрах Platform SDK, но это было бы странно. Или вдруг глобальное определение через свойства проекта вдруг отвалилось . Чудеса, однако.
Re[3]: Непонятности с UNICODE
От: Privalov  
Дата: 17.11.05 11:46
Оценка:
Здравствуйте, Сергей Мухин, Вы писали:

P>>Объяви: LPTSTR szBuff;


СМ>видно же, что она объявлена


Да, увидел. Уже записываю себя в индусы
Автор: Privalov
Дата: 17.11.05
.

Мне сейчас как раз ASCII на выходе нужен, да еще LPSTR в приведенном сообщении об ошибке откуда-то взялось. Обычно char * показывается. Вот это меня и сбило.

Там рядом с #define UNICODE еще #define _UNICODE сделать, и можно голову не ломать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.