2016-11-05 42 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; 
} 

但是,如果我使用多字節字符集一切工作正常。

回答

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

變量必須按照供應商文檔中的說明進行初始化,否則會導致未定義的行爲。錯誤的實現有時可能正常工作,我不知道爲什麼,你可以開始另一個問題。 –