HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0307
ポチ実行中のファイル(PID)から絶対パスを取得したいのですが・・・。6解決


ポチ

リンク

2017/3/7(Tue) 10:15:54|NO.78410

実行中のファイル(PID取得)から実行ファイルの絶対パスを取得したいのですが・・・。
宜しくお願い致します。

#include "kernel32.as" #define TH32CS_SNAPPROCESS 0x00000002 sdim processes, 10000 sdim file,10000 count = 0 CreateToolhelp32Snapshot TH32CS_SNAPPROCESS, 0 hSnapshot = stat if (hSnapshot < 0) : stop sdim lppe, 296 lpoke lppe, 0, 296 Process32First hSnapshot, varptr(lppe) if (stat == 0) : stop // 実行ファイル名・PIDを取得 pid = lpeek(lppe, 8) getstr exefile, lppe, 36 processes += strf("%s (%d)\n", exefile, pid) count++ pro="" sdim program,cont dim no,count exe="" repeat Process32Next hSnapshot, varptr(lppe) if (stat == 0) : break // 実行ファイル名・PIDを取得 pid = lpeek(lppe, 8) no.cnt=lpeek(lppe,8) getstr exefile, lppe, 36 processes += strf("%s (%d)\n", exefile, pid) exe +="\n"+exefile program.cnt=exefile count++ loop pos 10,100 : mes "プログラムを終了します" objsize 180,14 : pos 10,20 : combox comstr,100,processes objsize 60,26 : pos 200,20 : button "選択",*go01 stop *go01 button "実行",*owari mes no(comstr-1) mes ""+program(comstr-1)+"を終了します" stop *owari command="\\taskkill.exe /pid "+no(comstr-1) exec dir_sys + command, 2 stop end end



この記事に返信する


MillkeySoftware

リンク

2017/3/8(Wed) 11:35:04|NO.78424

プロセスの実行ファイルパスは、同じ CreateToolhelp32Snapshot の TH32CS_SNAPMODULE です。
モジュールリストは、Module32First で検索してください。このリストの 0 番目がプロセスの絶対パスとなります。



ポチ

リンク

2017/3/8(Wed) 12:25:27|NO.78425

ありがとうございます。調べたら詳しく記載してあるサイトがありましたが・・・
WindowsAPIについては殆ど分からなくて、今回のスクリプトもコピペで内容を全く理解していなくて・・・
モジュールとかの使い方が分かりません。具体的な使い方の実例を教えて頂けると大変有難いのですが・・・。
それでもおバカな私は理解できないかもしれませんが・・・ (/_<) (ノ_・。) (ノ_-。) (ノ△・。) (w_−;
http://rarara.cafe.coocan.jp/cgi-bin/lng/vc/vclng.cgi?print+200407/04070064.txt
このスクリプトで何をしたいかと言うと、実行中のプログラムをタイマーで終了させるプログラムを作りたいのですが、
システムファイルとか重要なファイルを誤って終了させる事を避ける為に絶対パスから、アイコンを取得して、
システムファイル以外のアイコンがあるファイルだけを選択出来る様にしたいと思っています。
因みにパスからアイコンを取得するスクリプトは下記の通りです。
これもパクリものですが、何かのご参考になれば幸いです。

#module mod_str_replace #deffunc str_replace var src, str search, str replace repeat strlen(src) await idx = instr(src, 0, search) if(idx == -1){ break } src = strmid(src, 0, idx) + replace + strmid(src, idx + strlen(search), strlen(src) - idx) loop return #global ////////////////////////////////////////////////////////////////////// // MODULE DRAW_ICON #module DRAW_ICON // 関数の登録 #uselib "shell32.dll" #cfunc ExtractAssociatedIcon "ExtractAssociatedIconA" int,str,var #uselib "user32.dll" #func DestroyIcon "DestroyIcon" int #cfunc DrawIcon "DrawIcon" int,int,int,int #cfunc DrawIconEx "DrawIconEx" int,int,int,int,int,int,int,int,int // アイコン(hIcon)を取得 #defcfunc GetIcon str filename,int p iIcon=p hIcon=ExtractAssociatedIcon(hinstance,filename,iIcon) return hIcon // アクティブウィンドウの // カレントポジション(ginfo(22),ginfo(23))にINDEX(p)の // アイコン(filename)を描画 #deffunc DrawIcon str filename,int p hIcon=GetIcon(filename,p) if( hIcon == 0 ) : return 0 ret=DrawIcon(hdc,ginfo(22),ginfo(23),hIcon) redraw 1 DestroyIcon hIcon return ret // アクティブウィンドウの // カレントポジション(ginfo(22),ginfo(23))に // サイズ(x,y)でINDEX(p)のアイコン(filename)を描画 #deffunc DrawIconEx str filename,int p,int x,int y hIcon=GetIcon(filename,p) if( hIcon == 0 ) : return 0 ret=DrawIconEx(hdc,ginfo(22),ginfo(23),hIcon,x,y,0,0,0x03) redraw 1 DestroyIcon hIcon return ret #global //////////////////////////////////////////////////////////////////////////// syscolor 15 boxf sysfont 0 pass="" pos 20,20 input pass,350,25,2000 pos 380,20 button "Enter",*syuuryou stop command= command+" /f" exec command,2 end *syuuryou search = "\\" replace = "/" str_replace pass, search, replace search = "/" replace ="\\\\" str_replace pass, search, replace syscolor 15 boxf color 0,0,0 pos 20,50 mes pass //pass="G:\\My Document Vol.1_Install Files\\Install Files\\copy program\\Program Files (x86)\\aichan4.03\\aichan.exe" //DrawIconEx pass,0,120,120 pos 20,100 DrawIconEx pass,0,16,15 pos 60,100 DrawIcon pass,0 pos 110,100 DrawIconEx pass,0,120,120 wait 2000 end



osakana

リンク

2017/3/11(Sat) 23:08:51|NO.78490

元のスクリプトの書き方を模倣して、
MillkeySoftwareさんの提示されたModule32Firstを使うやり方で
フルパスを取得する様にして見ました(物によってはパスが入っていない様です)。

#include "kernel32.as" #define TH32CS_SNAPPROCESS 0x00000002 #define TH32CS_SNAPMODULE 0x00000008 sdim processes, 10000 sdim program,cont dim no count = 0 CreateToolhelp32Snapshot TH32CS_SNAPPROCESS, 0 hSnapshot = stat if (hSnapshot < 0) : stop sdim lppe, 296 lpoke lppe, 0, 296 Process32First hSnapshot, varptr(lppe) if (stat == 0) : stop // 実行ファイル名・PIDを取得 pid = lpeek(lppe, 8) no.0 = pid getstr exefile, lppe, 36 processes += strf("%s (%d)\n", exefile, pid) exe="" program.0 = exefile count++ repeat , 1 Process32Next hSnapshot, varptr(lppe) if (stat == 0) : break // 実行ファイル名・PIDを取得 pid = lpeek(lppe, 8) no.cnt=pid getstr exefile, lppe, 36 processes += strf("%s (%d)\n", exefile, pid) exe +="\n"+exefile program.cnt=exefile count++ loop CloseHandle hSnapshot pos 10,100 : mes "プログラムを終了します" objsize 180,14 : pos 10,20 : combox comstr,100,processes objsize 60,26 : pos 200,20 : button "選択",*go01 cx = GINFO_CX cy = GINFO_CY stop *go01 color 255, 255, 255 : boxf cx, cy, GINFO_WINX, GINFO_WINY : color pos cx, cy if (idbtn == 1) : clrobj idbtn(1) button "実行",*owari idbtn = 1, stat mes comstr mes no(comstr) mes ""+program(comstr)+"を終了します" // プロセスID からモジュールの実行ファイルフルパスを取得 // スナップショットをとる path = "" pid = no(comstr) CreateToolhelp32Snapshot TH32CS_SNAPMODULE, pid hSnapshot = stat if (hSnapshot != INVALID_HANDLE_VALUE) { sdim me32, 548 ; MODULEENTRY32 構造体 lpoke me32, 0, 548 ; 構造体サイズ Module32First hSnapshot, varptr(me32) ; スナップショットから取得 if (stat != 0) : getstr path, me32, 288,, 260 ; 構造体からフルパス取得 CloseHandle hSnapshot } // 実行ファイルのフルパス表示 mes path stop *owari command="\\taskkill.exe /pid "+no(comstr-1) exec dir_sys + command, 2 stop end
また同じ手法でプロセスIDと実行ファイルパスの対応表を予め作るならこうでしょうか。
こっちは自分流にスクリプトを書いてあります(過去に作った物を組み合わせて改造しただけ)。

#module #uselib "kernel32.dll" #cfunc CreateToolhelp32Snapshot "CreateToolhelp32Snapshot" sptr,sptr #func CloseHandle "CloseHandle" sptr #func Process32First "Process32First" sptr,sptr #func Process32Next "Process32Next" sptr,sptr #func Module32First "Module32First" sptr,sptr ;#func Module32Next "Module32Next" sptr,sptr #const MAX_MODULE_NAME32 255 #const MAX_PATH 260 #const INVALID_HANDLE_VALUE $FFFFFFFF #const TH32CS_SNAPPROCESS $00000002 ; プロセスリストをスナップショットに含める #const TH32CS_SNAPMODULE $00000008 ; 指定されたプロセスのモジュールリストをスナップショットに含る #const pe_dwSize 0 #const pe_cntUsage 1 #const pe_th32ProcessID 2 #const pe_th32DefaultHeapID 3 #const pe_th32ModuleID 4 #const pe_cntThreads 5 #const pe_th32ParentProcessID 6 #const pe_pcPriClassBase 7 #const pe_dwFlags 8 #const pe_szExeFile 9 #const me_th32ModuleID 1 #const me_th32ProcessID 2 #const me_GlblcntUsage 3 #const me_ProccntUsage 4 #const me_modBaseAddr 5 #const me_modBaseSize 6 #const me_hModule 7 #const me_szModule 8 #const me_szExePath me_szModule + (MAX_MODULE_NAME32 + 1) / 4 // プロセスID一覧を数値配列として取得(プロセスID と 親プロセスID) // 結果は arr で受け取る // 戻り値(整数):項目の取得数 失敗したら 0 を返す #deffunc get_process_id array arr, local hsnapshot, local pe32, local num dim arr, 2, 1000 ; 結果格納配列 num = 0 ; 取得数返し用 hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0) ; スナップショットを撮る if hSnapshot = INVALID_HANDLE_VALUE :return 0 dim pe32, 74 ; PROCESSENTRY32 構造体 pe32 = 296 ; 構造体サイズ // スナップショットから一覧を作成 Process32First hSnapshot, varptr(pe32) ; スナップショットから最初の項目を取得 repeat if stat = 0 :break arr(0, cnt) = pe32.pe_th32ProcessID, pe32.pe_th32ParentProcessID ; 構造体から結果取得 Process32Next hSnapshot, varptr(pe32) ; スナップショットから次の項目を取得 num ++ loop CloseHandle hSnapshot return num // プロセスIDから最初のモジュールのフルパスを取得 // 戻り値(文字列):結果のパス文字列 失敗したら空文字列を返す #defcfunc get_module_path int pid, local hsnapshot, local me32, local path hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid) ; スナップショットを撮る if hSnapshot = INVALID_HANDLE_VALUE :return "" dim me32, 137 ; MODULEENTRY32 構造体 me32 = 548 ; 構造体サイズ path = "" ; 結果パス返し用 Module32First hSnapshot, varptr(me32) ; スナップショットから最初の項目を取得 if stat ! 0 :dupptr path, varptr(me32.me_szExePath), MAX_PATH, 2 ; 構造体から結果を取得 CloseHandle hSnapshot return path #global // プロセスID一覧を配列で取得 get_process_id arr_pid num = stat sdim text, 1024 * 10 // プロセスIDと実行ファイルフルパスの一覧を文字列として作る repeat num // プロセスIDを配列から一つ取り出す pid = arr_pid(0, cnt) // 取り出したプロセスIDからファイルのパスを取得 text += strf("%d\t: %s\n", pid, get_module_path(pid)) loop // 結果表示 title "プロセスID数:" + num mesbox text, GINFO_WINX, GINFO_WINY - 20, 5
合っているか分かりませんが参考になれば幸いです。
(一部スクリプト上のうっかりなどを修正して投稿し直しました(2回))



ポチ(夜勤明け)

リンク

2017/3/12(Sun) 06:50:29|NO.78493

coldtime様、ありがとうございます。
ソフトはヒロソフ(Hiroaki Software)様のADMINSTART(今ではHPがないので・・・残念ですが・・・)
を使って、管理者権限で起動する様にしました(あらかじめ、その旨を記載して、同意の上でソフト
を起動する事にします)。
普通にPIDは取得出来るのですが、アクセス権限がないとフルパスは取得出来ないものなのですね。
知りませんでした。
osakana様、ありがとうございます。しかも、もしかするとシステムプログラムとかは表示されないのですね。
これなら面倒なアイコン取得しなくてもそのまま使えそうです。
本当に助かりました。ありがとうございます。
MillkeySoftware様、私ももっともっと頑張って、今回のスクリプトを何とか理解できる様にしたいと思います。
皆様本当にありがとうございます。



osakana

リンク

2017/3/12(Sun) 23:46:10|NO.78510

見返したらまだうっかりがありました。すみません。
NO.78490の私の投稿の一つ目のスクリプトについて
以下の二つを訂正します。

一つ目は、
インデックスの扱いを変えたのにそのまま書き換え忘れてた部分で

*owari command="\\taskkill.exe /pid "+no(comstr-1)
となっている箇所を

*owari command="\\taskkill.exe /pid "+no(comstr)
に。

それと、2点目は、
CreateToolhelp32Snapshotのエラーチェックに
INVALID_HANDLE_VALUEを使っているのにそれを定義し忘れていたので
上部の#define仲間の辺りに

#define INVALID_HANDLE_VALUE $FFFFFFFF
を新たに追加。

以上です。お手数お掛けします。



ポチ(夜勤明けレギュラーワーク)

リンク

2017/3/14(Tue) 07:51:16|NO.78523

coldtime様、了解です。
でも、その他に今回はタスクマネージャーを起動させたり他の付加的な事の為に、
管理者権限で起動します。丁寧にありがとうございます。(o^−^o)
osakana様、了解です。
>お手数お掛けします。
いえいえ、素晴らしいスクリプトをありがとうございます。
製作が一気に進みました。感謝です。
d(^^*)



ONION software Copyright 1997-2023(c) All rights reserved.