我正在使用以下代碼來嘗試獲取notepad.exe的PID,但它沒有找到該行程。
我目前在 Windows 10 上運行,使用 VS Studio 19 作為 Release x64 進行編譯。
我還試圖找到其他行程,比如chrome.exe、calculator.exe等,但什么也找不到。
DWORD GetProcessId(LPCTSTR ProcessName)
{
PROCESSENTRY32 pt;
HANDLE hsnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) 。
std::wcout << "錯誤。" << GetLastError() << std::endl; // 錯誤。0
pt.dwSize = sizeof(PROCESSENTRY32)。
std::wcout << "錯誤。" << GetLastError() << std::endl; // 錯誤。0
if (Process32First(hsnap, &pt)) { //必須首先呼叫這個。
do {
if (!lstrcmpi(pt.szExeFile, ProcessName) {
CloseHandle(hsnap)。
return pt.th32ProcessID。
}
} while (Process32Next(hsnap, & pt))。
}
std::wcout << "錯誤。" << GetLastError() << std::endl; //錯誤:24。
CloseHandle(hsnap); //失敗時關閉手柄。
return 0;
}
int _tmain(int argc, _TCHAR* argv[] )
{
DWORD processId。
processId = GetProcessId(TEXT("notepad.exe")) 。
std::wcout << "processId: " << processId << std::endl;
return 0;
在除錯時,我看到代碼跳過了do while,直接跳到CloseHandle(hsnap)
GetLastError()在這一行回傳24。
uj5u.com熱心網友回復:
你發布的除錯輸出視窗的圖片顯示pt.dwSize被設定為2168。這看起來是錯誤的。pt.dwSize很重要,它被Windows用于版本控制。
在我的電腦上,sizeof(PROCESSENTRY32)是556(這取決于Windows版本,我使用Windows 10)。如果專案不是Unicode的,大小應該是它的一半。在VS中,你可以右鍵點擊PROCESSENTRY32,它會帶你到這個定義:
typedef struct tagPROCESSENTRY32W<
{
DWORD dwSize。
DWORD cntUsage。
DWORD th32ProcessID; //此行程 // associated exe
DWORD cntThreads。
DWORD th32ParentProcessID; //此行程的父行程。
LONG pcPriClassBase; //行程的執行緒的基本優先級。
DWORD dwFlags。
WCHAR szExeFile[MAX_PATH]; //Path。
} processentry32w;
MAX_PATH應該是260。我的猜測是,你重新定義了MAX_PATH,或者你在某處放了錯誤的#pragma陳述句。或者有什么奇怪的事情發生。試著重新啟動Windows(使用Restart而不是shutdown/start)
另外,用PROCESSENTRY32 pt = {0}
PROCESSENTRY32 pt = { 0 };
pt.dwSize = sizeof(PROCESSENTRY32)。
if (!Process32First(hsnap, &pt))
{
DWORD err = GetLastError()。
std::cout << "Process32First failed
"。
std::cout << pt.dwSize << " GetLastError : "/span> << err << "
"。
CloseHandle(hsnap)。
return DWORD(-1)。
唯一預期的GetLastError是ERROR_NO_MORE_FILES,如Windows檔案中所示。如果錯誤是其他的,這意味著該函式已經完全失敗了。
如果你的專案是Unicode,因為它應該是,考慮避免那些T宏。只要使用GetProcessId(L "notepad.exe");和LPCWSTR等。
P>我運行了你的代碼,它在我的電腦上很好。唯一的區別是sizeof(PROCESSENTRY32)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/320290.html
標籤:
上一篇:無法用bs4提取表格
下一篇:我如何用c 改變/設定DNS?

