2013-07-30 9 views
3

Я все еще экстремальный noob, когда дело доходит до C++. И одна из вещей (на данный момент), которую я сейчас ненавижу, - это 1 000 000 000 различных типов переменных в winAPI. Эта небольшая программа, которую я сделал, чтобы проверить, существует ли окно, было сделано очень быстро. Но какая самая сложная часть? Просто сравнивая «строки» вместе, чтобы увидеть, соответствует ли это. Самая простая часть - самая сложная!Сравнение TCHAR с String

В любом случае, на мой вопрос: Как я могу сравнить к toFind, чтобы увидеть, если они совпадают?

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam){ 
    TCHAR a[260]; 
    string toFind = "Google Chrome"; 

    hwnd = GetParent(hwnd); 
    GetWindowText(hwnd, a, sizeof(a)); 

    if(strcmp(a,toFind) == 0){   //doesn't work 
     cout << "found the window"; 
    } 

    return TRUE; 
} 
+1

Вы компиляции с 'UNICODE' определена? Ответ будет зависеть от того, является ли 'TCHAR'' wchar_t' или 'char'. –

+0

@JesseGood "Набор символов: используйте набор символов Unicode" – Justin

+0

@ Джесси: Этого не нужно. Весь смысл семейства 't' заключается в том, чтобы абстрагироваться от того, определен ли UNICODE или нет. – icktoofay

ответ

3

Вы не должны использовать string в этом случае, но и TCHAR[], а затем сравнить с соответствующей функцией обертку:

TCHAR toFind[] = _T("Google Chrome"); 

... 

if (_tcscmp(a, toFind) == 0) 

TCHAR может быть char или wchar_t, в зависимости от того, определяется ли UNICODE (и я надеюсь, что - это, определенный в вашем случае, что также может объяснить, почему он не работает напрямую). Поэтому, если вы решите использовать его (я бы не стал, поскольку я уверен, что никогда, никогда не буду писать программное обеспечение для Windows 9x/ME снова или вообще программное обеспечение без поддержки Unicode), вы также должны соблюдать свои правила.

+0

Более простым решением было ввести typedef в 'tstring' (т.'std :: basic_string '). Но действительно, сегодняшним простым решением является 'UNICODE' – MSalters

+0

Я не знал, что могу использовать' std :: basic_string 'как простой старый' T [] ', из-за того, что он не является разработчиком C++. Ответ Джесси, вероятно, все равно лучше (но также указывает на ловушку этого подхода). – Joey

0

Измените тип строки с "string" на "wstring". Вам также придется изменить «strcmp» на что-то вроде «wstrcmp». В принципе, wstring - это широкие строки, используемые в UNICODE.

5

Самый простой способ, вероятно, не использовать массивы с стиле для начала и так как вы компилируете с UNICODE использовать std::wstring:

std::wstring a; 
a.resize(260); 
std::wstring toFind = L"Google Chrome"; 

hwnd = GetParent(hwnd); 
int size = GetWindowText(hwnd, &a[0], a.size()); 
a.resize(size); 

Тогда просто как:

if(a == toFind) 
{ 

} 
+0

Я не думаю, что на самом деле будет работать как есть. 'const char * const Значение =" Google Chrome "; строка buf (значение); строка buf2; buf2.resize (260); strcpy (& buf2 [0], значение); cout << "Equal?" << (buf == buf2) << "\ n"; ' Отпечаток' Equal? 0' для меня. 'string' может содержать встроенные нули. – Joel

+0

@Joel: Спасибо за комментарий. Я забыл изменить размер строки после вызова (обновлено). В вашем примере просто добавьте 'buf2.resize (buf.size());' после cal в 'strcpy'. –

+0

В этом случае он будет содержать встроенные nuls. Есть один в '[260]', но 'GetWindowText (hwnd, & a [0], 260)' добавляет nul _before_ '[260]'. – MSalters

0

std :: string - это typedef из std :: basic_string. std :: wstring - typedef std :: basic_string.

Что вы хотите

typedef std::basic_string<TCHAR> tstring; 

А затем использовать в-вместо станд :: строки.

Смотрите также tchar vs wstring и std::basic_string

Смежные вопросы