的問題進行了描述是,你正在使用的TCHAR
版本Process32First()
/Process32Next()
,和你的調試器screnshot清楚地表明,你正在編譯您對Unicode的項目,所以TCHAR
映射到WCHAR
,因此process.szExeFile
是WCHAR[]
陣列。您錯誤地將該數組類型轉換爲char*
指針。您不能直接將Unicode字符串與Ansi字符串進行比較。在比較之前,您需要將一個字符串轉換爲另一個字符串的編碼。
您還在泄漏CreateToolhelp32Snapshot()
返回的HANDLE
。
因爲你是傳遞一個ANSI std::string
輸入您GetProcessValues()
功能,最簡單的解決辦法是使用安思版本Process32First()
/Process32Next()
代替,所以process.szExeFile
現在是一個CHAR[]
陣列,因此沒有轉換需要:
HANDLE GetProcessValues(std::string ProcName)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE)
return NULL;
PROCESSENTRY32A process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
const char* ProcNameChar = ProcName.c_str();
HANDLE hProc = NULL;
if (Process32FirstA(snapshot, &process))
{
do
{
if (_stricmp(process.szExeFile, ProcNameChar) == 0)
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
break;
}
}
while (Process32NextA(snapshot, &process));
}
CloseHandle(snapshot);
return hProc;
}
但是,你真的應該使用安西的API望而卻步。 Windows是一個基於Unicode的操作系統,並且已經有很長一段時間了。使用統一的API,而不是:
HANDLE GetProcessValues(std::wstring ProcName)
{
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (snapshot == INVALID_HANDLE_VALUE)
return NULL;
PROCESSENTRY32W process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
const wchar_t* ProcNameChar = ProcName.c_str();
HANDLE hProc = NULL;
if (Process32FirstW(snapshot, &process))
{
do
{
if (_wcsicmp(process.szExeFile, ProcNameChar) == 0)
{
hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, process.th32ProcessID);
break;
}
}
while (Process32NextW(snapshot, &process));
}
CloseHandle(snapshot);
return hProc;
}
如果您ProcName
參數絕對必須是一個std::string
,那麼您可以:
使用MultiByteToWideChar()
,std::wstring_convert
等轉換ProcName
爲Unicode,然後比較這會導致Unicode API返回的字符串。
使用WideCharToMultiByte()
,std::wstring_convert
等將字符串從Unicode API轉換爲Ansi,然後將這些結果與ProcName
進行比較。
從你的圖片'process.szExeFile'是一個wchar *不是char *。 – drescherjm
爲什麼你在'_stricmp'的第一個參數中轉換爲'char *'?如果是關閉類型不匹配錯誤的編譯器,停止這樣做併爲函數提供正確的字符串類型。永遠不會投射字符串類型 - 投射是**不是**轉換。 – PaulMcKenzie
你對編譯器撒謊了,並且得到了你剛纔的甜點 –