|
 |
|
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

| |
|
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

| |
|
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様、私ももっともっと頑張って、今回のスクリプトを何とか理解できる様にしたいと思います。
皆様本当にありがとうございます。
|
|
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(^^*)
|
|