2016-11-05 4 views
0

У меня есть следующая проблема:Процесс снимок не может сравниваться с широкими строками

Я хочу, чтобы следить за запущенными процессами с помощью CreateToolhelp32Snapshot и Process32First/Далее. Однако я хочу использовать кодировку Unicode по умолчанию.

bool active(const std::wstring& process_name) 
{ 
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if (snapshot == INVALID_HANDLE_VALUE) 
     return false; 

    PROCESSENTRY32 entry; 

    if (Process32First(snapshot, &entry)) 
    { 
     if (process_name.compare(entry.szExeFile) == 0) 
     { 
      CloseHandle(snapshot); 
      return true; 
     } 
    } 

    while (Process32Next(snapshot, &entry)) 
    { 
     if (process_name.compare(entry.szExeFile) == 0) 
     { 
      CloseHandle(snapshot); 
      return true; 
     } 
    } 

    CloseHandle(snapshot); 

    return false; 
} 

int main() 
{ 
    SetConsoleTitle(L"Lel"); 

    if (active(L"notepad++.exe")) 
     std::cout << "Hello" << std::endl; 
    else 
     std::cout << ":(" << std::endl; 
} 

Однако, если я использую multibyte-charset, все работает нормально.

ответ

0

Необходимо инициализировать entry и установить значение dwSize. dwSize значение идеи Windows по системе управления версиями и требуется:

PROCESSENTRY32 entry = { 0 }; 
entry.dwSize = sizeof(PROCESSENTRY32); 

Сравнение не должны быть чувствительны к регистру:

while (Process32Next(snapshot, &entry)) 
{ 
    if (_wcsicmp(process_name.c_str(), entry.szExeFile) == 0) 
    { 
     CloseHandle(snapshot); 
     return true; 
    } 
} 
+0

Спасибо. Не могли бы вы объяснить, почему проблема возникает, когда я использую кодировку Unicode? – Cyrex1337

+0

Переменные должны быть инициализированы, как описано в документации поставщика, иначе это приведет к неопределенному поведению. Иногда неправильная реализация может работать исправно, я не знаю, почему, вы можете задать другой вопрос. –