全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2831
推到 Plurk!
推到 Facebook!

如何取得檔案路徑

答題得分者是:leveon
P.D.
版主


發表:571
回覆:3887
積分:3677
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-08-12 10:40:03 IP:118.160.xxx.xxx 未訂閱
請問各位:

我偵測 Process(工作管理員) 中的某一支程式,windows本身有提供一個"開啟檔案位置(在win7中), 可以切換到這支程式位置, 但delphi 有沒有什麼方法可以取得這支程式當初執行時的路徑?
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-08-12 11:46:56 IP:111.240.xxx.xxx 訂閱
流程 
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.
版主


發表:571
回覆:3887
積分:3677
註冊:2006-10-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-08-13 01:38:35 IP:118.160.xxx.xxx 未訂閱
感謝 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上來是有對齊的, 但存下去後就...
編輯記錄
P.D. 重新編輯於 2012-08-12 11:44:23, 註解 無‧
P.D. 重新編輯於 2012-08-12 11:45:19, 註解 無‧
P.D. 重新編輯於 2012-08-12 11:46:47, 註解 無‧
leveon
資深會員


發表:30
回覆:386
積分:303
註冊:2012-02-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-08-13 14:08:36 IP:118.165.xxx.xxx 訂閱
QueryFullProcessImageName 是vista後才有的api
我自己也沒試過 都是網路上看來的 如害你兜圈 不好意思

Windows XP x32 = GetProcessImageFileName()
Windows Vista = QueryFullProcessImageName()
Windows 7 = QueryFullProcessImageName()

從這看來的
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684919(v=vs.85).aspx

我來幫delphi宣告一下
var
QueryFullProcessImageName: function(hProcess: THandle; dwFlags: DWord;
ImageFileName: PWideChar; dwSize: PDWord): BOOL; stdcall;
begin
@QueryFullProcessImageName := GetProcAddress(LoadLibrary('kernel32.dll'),
'QueryFullProcessImageNameW');
end;

可能會這樣
http://boardreader.com/thread/QueryFullProcessImageName_does_not_work_rny0__f652ba04-8819-43dd-b301-a1303ccf3de0.html

都是G來的 不確定 等待有緣人測試

看來
GetModuleFileNameEx 從win 2000到 win7 64都適用 謝謝你的回饋
===================引 用 P.D. 文 章===================
感謝 leveon 的指點
雖然post 的網址的程式有問題, 但我利用 leveon 查詢 QueryFullProcessImageName
的確找到想要的程式(雖然花了不少時間研究)
以下是我整理測試可用的 function (在 x64下亦可正常運作)
必須 users ASAPI;
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.
版主


發表:571
回覆:3887
積分:3677
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2012-08-13 18:28:17 IP:118.160.xxx.xxx 未訂閱
別這麼說, 能透過你提供的訊息, 我找到能解決的方法, 這才是最重要的, 
所以分享才是最珍貴的!
===================引 用 leveon 文 章===================
QueryFullProcessImageName 是vista後才有的api
我自己也沒試過 都是網路上看來的 如害你兜圈 不好意思

Windows 2000 = GetModuleFileName()
Windows XP x32 = GetProcessImageFileName()
Windows XP x64 = GetProcessImageFileName()
Windows Vista = QueryFullProcessImageName()
Windows 7 = QueryFullProcessImageName()
系統時間:2017-12-12 10:30:44
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!