ОК, сначала несколько определений.
Типы '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)