如何取得檔案路徑 |
答題得分者是:leveon
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
leveon
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
流程
http://stackoverflow.com/questions/9570037/how-to-get-path-of-the-running-process-with-lack-of-users-permissions code 請參閱 http://embarcadero.newsgroups.archived.at/public.delphi.nativeapi/201005/1005053171.html google QueryFullProcessImageName 會得到更多code ===================引 用 P.D. 文 章=================== 請問各位: 我偵測 Process(工作管理員) 中的某一支程式,windows本身有提供一個"開啟檔案位置(在win7中), 可以切換到這支程式位置, 但delphi 有沒有什麼方法可以取得這支程式當初執行時的路徑?
編輯記錄
leveon 重新編輯於 2012-08-11 21:50:54, 註解 無‧
|
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝 leveon 的指點
雖然post 的網址的程式有問題, 但我利用 leveon 查詢 QueryFullProcessImageName 的確找到想要的程式(雖然花了不少時間研究) 以下是我整理測試可用的 function (在 x64下亦可正常運作) 必須 users ASAPI; [code delphi] function GetModulePath(ProcName: string): string; var OK: Bool; hPL: THandle; hPL1: THandle; hMod: HMODULE; cbNeeded: DWORD; buf: array[0..MAX_PATH] of AnsiChar; ProcessStruct: TProcessEntry32; begin hPL:= CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); videohandle:= hPL; ProcessStruct.dwSize:= SizeOf(TProcessEntry32); OK:= Process32First(hPL, ProcessStruct); while OK do begin if UpperCase(ProcessStruct.szExeFile) = UpperCase(ProcName) then begin hPL1:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, ProcessStruct.th32ProcessID); if hPL1<>0 then begin if EnumProcessModules(hPL1,@hMod,sizeof(hMod),cbNeeded) then begin ZeroMemory(@buf,MAX_PATH 1); GetModuleFileNameEx(hPL1, hMod, buf, MAX_PATH 1); Result:= strpas(buf); end; end; end; OK:= Process32Next(hPL, ProcessStruct); end; CloseHandle(hPL); end; [/code] 使用 GETMODULEPATH('NOTEPAD.EXE') PS.位置請自行對齊, 我PO上來是有對齊的, 但存下去後就... |
leveon
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:30 回覆:389 積分:303 註冊:2012-02-12 發送簡訊給我 |
QueryFullProcessImageName 是vista後才有的api
我自己也沒試過 都是網路上看來的 如害你兜圈 不好意思 Windows XP x32 = GetProcessImageFileName() Windows Vista = QueryFullProcessImageName() psapi [code delphi] function GetModulePath(ProcName: string): string; var OK: Bool; hPL: THandle; hPL1: THandle; hMod: HMODULE; cbNeeded: DWORD; buf: array[0..MAX_PATH] of AnsiChar; ProcessStruct: TProcessEntry32; begin hPL:= CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0); videohandle:= hPL; ProcessStruct.dwSize:= SizeOf(TProcessEntry32); OK:= Process32First(hPL, ProcessStruct); while OK do begin if UpperCase(ProcessStruct.szExeFile) = UpperCase(ProcName) then begin hPL1:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, ProcessStruct.th32ProcessID); if hPL1<>0 then begin if EnumProcessModules(hPL1,@hMod,sizeof(hMod),cbNeeded) then begin ZeroMemory(@buf,MAX_PATH 1); GetModuleFileNameEx(hPL1, hMod, buf, MAX_PATH 1); Result:= strpas(buf); end; end; end; OK:= Process32Next(hPL, ProcessStruct); end; CloseHandle(hPL); end; [/code] 使用 GETMODULEPATH('NOTEPAD.EXE') PS.位置請自行對齊, 我PO上來是有對齊的, 但存下去後就... |
P.D.
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
別這麼說, 能透過你提供的訊息, 我找到能解決的方法, 這才是最重要的,
所以分享才是最珍貴的! ===================引 用 leveon 文 章=================== QueryFullProcessImageName 是vista後才有的api
我自己也沒試過 都是網路上看來的 如害你兜圈 不好意思 Windows XP x32 = GetProcessImageFileName() Windows Vista = QueryFullProcessImageName() Windows 7 = QueryFullProcessImageName() |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |