­
12月 2017 - 歐維斯福利設

【C++】在沒有視窗名稱的情況下確認程式是否開啟

晚上10:18 / BY LBT
之前我有寫一篇文章說明如何透過視窗的名稱來得知程式是否有在執行(請參考這裡),但是有時視窗名稱是無法得知(背景程式)或無法預期的,像是"工作管理員"這個程式在WIN10叫"工作管理員",但在WIN7叫"Windows 工作管理員",為了提高程式相容性,我們還有一個辦法:透過執行檔的名稱來確定。 我用的方法是把所有處理程序列舉出來再一一檢查是否有我們要找的執行檔。 我們可以利用tlhelp32.h中所提供的API函式:CreateToolhelp32Snapshot()、Process32First()、Process32Next() 來完成我們要做的事。 先利用函式CreateToolhelp32Snapshot()取得一個處理程序的串列 PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); 上述程式碼中的entry是一個PROCESSENTRY32的結構,宣告在tlhelp32.h內,其原型如下: typedef struct tagPROCESSENTRY32 { DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; DWORD cntThreads; DWORD th32ParentProcessID; LONG pcPriClassBase; DWORD dwFlags; CHAR szExeFile[MAX_PATH]; } PROCESSENTRY32; typedef PROCESSENTRY32 *PPROCESSENTRY32; typedef PROCESSENTRY32 *LPPROCESSENTRY32; 總之他是用來儲存一些有關處理程序控制代碼等的結構,在這邊是snapshot上的一個「迭代器」 再來用Process32First()來初始化entry Process32First(snapshot,&entry) 之後就可以用Process32Next()來「暴力」求解了,就是在CreateToolhelp32Snapshot()回傳的串列中一一往下找,並且比對entry中的szExeFile是否與要搜尋的程式執行檔名稱相同就行了。 while (Process32Next(snapshot,&entry)==TRUE){ string binPath = entry.szExeFile; if(binPath.find("test.exe") != wstring::npos){ cout<<"該程式已開啟,PID:"<<entry.th32ProcessID<<endl; } }...

Continue Reading

【C++】如何發行VC程式?

晚上9:40 / BY LBT
1.到【這裡】下載Immunity Debugger(要填些資料,亂打即可)。 2.安裝Immunity Debugger。 3.在桌面建立一個資料夾。 4.把你用VC編譯的執行檔拉到Immunity Debugger裡面(注意喔,VC2017的專案位置預設是在使用者目錄下一個叫做source的資料夾裡,跟之前不一樣)。 5.點選左上角的"View",再點彈出選單的第二項。 6.照著右手邊那一欄的路徑一一把對應的檔案複製到你剛才建 立的資料夾(當然,執行檔也要)。 7.然後把你所建立的資料夾拿給別人就行了,別人只要點開資料夾內的執行檔無論有無裝VC都可以執行了。 今天的教學就到這邊結束,有問題可以在下面留言或到粉絲專頁發問喔!! ...

Continue Reading