❶ VC++ 判斷進程是否存在 問題
那段代碼就高賀是一戚銷派個現成的函數,你斗鬧直接用就行了,例如:if(GetProcessidFromName("qq.exe")) AfxMessageBox("存在");
❷ C++怎麼編寫一個強制關閉程序的程序
ring3級的都是調用 OpenProcess TerminateProcess 等相關的API函數,你自己找下這方面的代碼 。 如果只是為了結束它,你可以使用 sysinternals工具包中的 procexp.exe 這個功能強大。另外,有悔者時候吧,沒必要非得結束掉進程,你可以通過調用 suspendprocess等API函數把進程掛起,原來的時候,我在網吧上鋒談網,老是碰到一些管理軟體,用procexp直接右鍵」掛銀前碰起「 就好了,因為這樣的管理程序,往往都是互相創建和防結束的,掛起是最委婉且有效的作法。
❸ 怎麼獲取進程 C++
DWORD GetProcessIdFromName(LPCTSTR name) //通過執行文件名獲得進程ID的方法
{
PROCESSENTRY32 pe;
DWORD id = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hSnapshot,&pe) )
return 0;
do
{
pe.dwSize = sizeof(PROCESSENTRY32);
if( Process32Next(hSnapshot,&pe)==FALSE )
break;
if(strcmp(pe.szExeFile,name) == 0)
{
id = pe.th32ProcessID;
break;
}
} while(1);
CloseHandle(hSnapshot);
return id;
}
上面的函掘敏數通過程序獲取ID
有這個ID就可以操作這個進程了
比如,關蔽散和閉一宏盯個進程:QQ.exe
DWORD dwQQID = GetProcessIdFromName("QQ.exe");
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwQQID); //打開進程
if(!hProcess)
{
TerminateProcess(hProecss, 0); //關閉進程
}
CloseHandle(hProcess);
❹ PsGetProcessJob需要包含什麼頭文件
頭文件是
Ntddk.h
❺ 無法定位程序輸入點GetProcessId 於動態鏈接庫 KERNEL32.dll 怎麼辦啊
無法定位程序輸入點的修復方案:
軟體修復:
下載安裝金山衛士,進入主界面進入【查殺木馬】
然後點擊【快速掃描】即可
手動修復無法定位程序輸入點
於動態鏈接庫上方法
1.通過互聯網上搜索下載下載你所需dll,把你所想要的dll輸入到搜索框里去,注意搜索時一定要開啟金山衛士的上網安全瀏覽功能,以免因無法定位程序輸入點的問題導致進入掛馬或者釣魚站點引起電腦中毒。
2.重啟電腦快捷鍵f2或者f8進入安全模式
3.將缺少的dll放到C:\windows\system32\
即可
❻ VC++ 判斷進程是否存在的問題
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //創建系統進程列錶快照,返回一個快照的句柄。不懂快照、句柄是什麼意思的話自己網路,簡單的理解的話快照類似於資料庫中的視圖,而句柄就是一個無符號整數,相當於一個ID。
pe.dwSize=sizeof(PROCESSENTRY32); //這一句就是顯式地指明PROCESSENTRY32結構體的大小,看似有些多餘,但是MSDN上說不能省略,我自己測試的時候省略也會出錯。
if(!Process32First(hSnapshot,&pe)) return 0; //這一句調用Process32First開始遍歷快照中的進程列表,把進程的信息拷貝到pe這個數據結構中。如果失敗返回FALSE,也就不需要執行後續的Process32Next遍歷整個列表了。這個函數跟Process32Next配合可以逐個遍歷進程列表,Process32Next參數跟Process32First一樣,也同樣失敗返回FALSE,成功就會一個接一個逐個地把進程列表中快照中的進程的信息拷貝到pe這個數據結構中純鬧。值得一提的是,正是由於採用的是進程快照的方式獲取進程的信息,所以如果在這個過程中某個或某些進程被其他程序關閉或者自己結束,或者進程隊列中加入了新的進程,hSnapShot指向的快照中不會反映這個變化。SnapShot就好比給人拍張照,記錄的只是一個人瞬間的樣貌,但是從哲學上講事物都是運動的,無法代表這個人的現狀,同樣這里的進程快照能夠反映的也只是創建快照時系統的進程隊列中全部進程的狀況。使用快照的好處是什麼呢?就是不需要在後面的獲取進程的信息時每次都重新反復地獲取系統中的進程的列表,而是以快照的方式存儲起來,所以速度比較快,也利於保護數據。缺點就是沒有實時性。但是一般情況下快照就夠用了。
if(strcmp(pe.szExeFile,name)==0) //這個很好理解,就是比較pe.szExeFile和name是否一樣,具體的比較方法是比較兩者的ASCII碼的差值,不懂ASCII碼和strcmp的話自己網路,不解釋。
id=pe.th32ProcessID;
return id;
這兩句放在一起看作用就是返回進程的PID,就是CMD TASKLIST中看到的那個PID,是用來唯一標識進程的ID。後續的察皮OpenProcess訪問進程的操作需要的就是這個ID。你用OpenProcess可以得到進程的句柄hProcess,然後調用TerminateProcess hProcess,0就能夠強制結束一般的進程了。
中間的CloseHandle(hSnapshot); //這一句可以理解為垃圾回收,作用就是釋放掉用敗褲差CreateToolhelp32Snapshot創建的快照句柄標識的內存空間。
另外,樓下那位朋友說的很對,你的代碼無法做到不區分大小寫的比較進程名稱。所以最好自己添加個處理過程統一下大小寫。我給個不用CString的實現方法,僅供參考:
其實就是自己先編寫個全部轉換為大寫的函數然後再比較。
//內聯函數,用來返回空字元串。
inline char* DefReturn()
{
char *ret = new char[1];
ret[0] = '\0';
return ret;
}
char* UCase(char *chOri)
{
if(chOri == NULL) return DefReturn();
size_t nLen = strlen(chOri);
if(nLen)
{
char *chRet = new char[nLen+1];
for(size_t index = 0; index<nLen; index++)
{
chRet[index] = toupper(chOri[index]);
}
chRet[index] = '\0';
return chRet;
}
else
{
return chOri;
}
}
//全部轉化內大寫後開始比較
if(strcmp(UCase(pe.szExeFile),UCase(name))==0)
{
id=pe.th32ProcessID;
break;
}