Функции TCHAR [], LPWSTR, LPTSTR и GetWindow Text - PullRequest
0 голосов
/ 09 февраля 2010

Итак, GetWindowText объявлен в MSDN следующим образом:

int GetWindowText(      
    HWND hWnd,
    LPTSTR lpString,
    int nMaxCount
);

Однако, чтобы код работал, мы должны объявить второй параметр как

TCHAR[255] WTitle;

, а затем вызвать функцию GetWindowText(hWnd,Wtitle,255); LPTSTR - это указатель на массив tchar, поэтому объявление LPTSTR похоже на объявление TCHAR []? Это не работает таким образом, хотя. При использовании TCHAR [] программа возвращает действительный результат GetWindowText (это целое число, равное количеству символов в заголовке). Вопрос: как я могу получить точное название из TCHAR []? Код как

TCHAR[255] WTitle;
cout<< WTitle;

или

cout<< *Wtitle;

возвращает числа. Как я могу сравнить это с данной строкой?

TCHAR[4] Test= __T("TEST")
if (WTitle == Test) do smth

тоже не работает.

Ответы [ 5 ]

3 голосов
/ 09 февраля 2010

Ух ты, посмотрим, с чего начать.

Прежде всего, объявление WTitle должно выглядеть так:

TCHAR WTitle[255];

Далее, если cout не работает запись, это потому, что вы находитесь в режиме Unicode, поэтому вам нужно сделать это:

wcout << WTitle;

Или, чтобы лучше соответствовать всей структуре tchar, вы можете добавить это (на самом деле, я удивлен, что это уже не часть tchar.h):

#ifdef _UNICODE
    #define tcout wcout
#else
    #define tcout cout
#endif

и затем используйте:

tcout << WTitle;
2 голосов
/ 09 февраля 2010

ОК, сначала несколько определений.

Типы 'T' - это определения, которые будут оцениваться как CHAR (однобайтный) или WCHAR (двухбайтовый), в зависимости от того, есть ли у вас символ _UNICODE, определенный в настройках вашей сборки. Цель состоит в том, чтобы позволить вам ориентироваться как на ANSI, так и на UNICODE с одним набором исходного кода.

Определения:

TCHAR title[100];
TCHAR * pszTitle;

... не эквивалент. Первый определяет буфер из 100 TCHAR. Второй определяет указатель на один или несколько TCHAR, но не указывает на буфер. Кроме того,

sizeof(title) == 100   (or 200, if _UNICODE symbol is defined)
sizeof(pszTitle) == 4  (size of a pointer in Win32)

Если у вас есть такая функция:

void foo(LPCTSTR str);

... вы можете передать любую из двух вышеуказанных переменных в:

foo(title);    // passes in the address of title[0]
foo(pszTitle); // passes in a copy of the pointer value

ОК, поэтому вы получаете числа, вероятно, потому, что у вас do определен UNICODE (поэтому символы широкие), и вы используете cout, который характерен для однобайтовых символов. Используйте wcout вместо:

wcout << title;

Наконец, это не сработает:

TCHAR[4] Test == __T("TEST")   ("==" is equality comparison, not assignment)
if (WTitle == Test) do smth    (you're comparing pointers, use wcscmp or similar)
2 голосов
/ 09 февраля 2010

Краткий ответ: Если вы не пишете код для Win98, используйте wchar_t вместо TCHAR и wcout вместо cout

Длинная версия:

Существует тип TCHAR, позволяющий компилировать код в нескольких строковых режимах. Например, поддержка ASCII и Unicode. Тип TCHAR будет условно скомпилирован с соответствующим типом символов на основе настроек.

Все новые системы Win основаны на Unicode. Когда строки ASCII передаются функциям ОС, они конвертируются в Unicode и вызывают реальную функцию. Поэтому лучше всего использовать Unicode во всем приложении.

1 голос
/ 09 февраля 2010

В C wchar_t - это typedef для некоторого целочисленного типа (обычно short int). В C ++ это должен быть отдельный тип - но компиляторы Microsoft по умолчанию все равно используют для него typedef. Чтобы сделать его отдельным типом, вам нужно использовать переключатель компилятора /Zc:wchar_t. Впрочем, я не знаю, полностью ли это решит проблему - я не уверен, что в библиотеке есть реальные перегрузки для wchar_t как нативного типа для печати их в виде символов вместо коротких целых.

В целом, однако, я бы посоветовал не вмешиваться в «Microsoft» варианты Microsoft в любом случае - их правильная настройка - это боль, и они были предназначены прежде всего для обеспечения совместимости с 16-битной Windows в любом случае. Учитывая, что прошло уже около 10 лет с момента последнего выпуска в этой строке, вероятно, безопасно игнорировать его в новом коде, если вы действительно не уверены , по крайней мере, несколько ваших клиентов действительно его используют.

1 голос
/ 09 февраля 2010

Используйте _tcscmp или другой вариант (который принимает количество сравниваемых символов). http://msdn.microsoft.com/en-us/library/e0z9k731.aspx

Как:

if (_tcscmp(WTitle, Test) == 0) {
    // They are equal! Do something.
}
...