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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0511
窓口ウインドウハンドルから、実行ファイル名を取得する3解決


窓口

リンク

2010/5/11(Tue) 04:56:07|NO.32595

ウインドウハンドルから実行ファイル名を取得するスクリプトを組んでいるのですが。
うまく行きません。

 どなたか解りましたらよろしくお願いします。


#module #uselib "user32.dll" #func f_GetWindowThreadProcessID "GetWindowThreadProcessId" sptr , sptr #cfunc c_GetWindowLong "GetWindowLongA" sptr , sptr #uselib "kernel32.dll" #func f_OpenProcess "OpenProcess" sptr , sptr , sptr #func f_CloseHandle "CloseHandle" sptr #cfunc c_GetLastError "GetLastError" #uselib "psapi.dll" #func f_GetModuleFileNameEx "GetModuleFileNameExA" sptr , sptr , sptr , sptr #define GWL_HINSTANCE 0xFFFFFFFA #define PROCESS_ALL_ACCESS 0x001F0FFF #deffunc GetExeFileName int gefn_hwnd_ , var gefn_filename_ dim returnx sdim gefn_filename_ , 2048 // Windowのインスタンスハンドル hMod = c_GetWindowLong( gefn_hwnd_ , GWL_HINSTANCE ) // プロセスのId f_GetWindowThreadProcessId gefn_hwnd_ , varptr( PId ) sledID = stat // プロセスを開く f_OpenProcess PROCESS_ALL_ACCESS , 1 , PId hProcess = stat f_CloseHandle hProcess if hProcess ! 0 { // ファイル名を取得 f_GetModuleFileNameEx hProcess , hMod , varptr( gefn_filename_ ) , 2048 slen = stat if slen = 0 { // lerr = c_GetlastError() returnx |= (1<<31) | (1<<0) mes " ×GetModuleFileNameEx 関数が失敗しています。" }else{ returnx = slen mes " ○問題は存在しません" } }else{ returnx |= (1<<31) | (1<<1) mes " ×OpenProcess 関数が失敗しています。" } mes "  ▲ stat" mes strf(" hProcess %d " , hProcess ) mes strf(" ProcessID %d " , PId ) mes strf(" sledID %d " , sledID ) mes strf(" hMod %d " , hMod) mes "" mes strf(" FileNameLen %d " , slen ) mes strf(" filename %s " , strmid( gefn_filename_ , 0 , 100 ) ) return returnx #global GetExeFileName hwnd , filename mes filename



この記事に返信する


窓口

リンク

2010/5/11(Tue) 05:01:03|NO.32596

ちなみに、実行してみたら解ると思いますが、GetModuleFileNameEx 関数が失敗しているようです。



テック

リンク

2010/5/11(Tue) 10:39:12|NO.32601

f_GetModuleFileNameEx命令で引数にhProcessを渡して使用するのに
f_OpenProcess命令の直後に
f_CloseHandle hProcessを実行してプロセスを閉じているからです。
f_CloseHandle命令は、hProcessを使用しなくなったら呼び出すようにしましょう。

↓修正スクリプト
修正内容は、f_OpenProcess命令直後のf_CloseHandle命令をコメント化し、
mes命令で変数内容を出力する直前にf_CloseHandle命令を呼び出すようにしただけです。

#module #uselib "user32.dll" #func f_GetWindowThreadProcessID "GetWindowThreadProcessId" sptr , sptr #cfunc c_GetWindowLong "GetWindowLongA" sptr , sptr #uselib "kernel32.dll" #func f_OpenProcess "OpenProcess" sptr , sptr , sptr #func f_CloseHandle "CloseHandle" sptr #cfunc c_GetLastError "GetLastError" #uselib "psapi.dll" #func f_GetModuleFileNameEx "GetModuleFileNameExA" sptr , sptr , sptr , sptr #define GWL_HINSTANCE 0xFFFFFFFA #define PROCESS_ALL_ACCESS 0x001F0FFF #deffunc GetExeFileName int gefn_hwnd_ , var gefn_filename_ dim returnx sdim gefn_filename_ , 2048 // Windowのインスタンスハンドル hMod = c_GetWindowLong( gefn_hwnd_ , GWL_HINSTANCE ) // プロセスのId f_GetWindowThreadProcessId gefn_hwnd_ , varptr( PId ) sledID = stat // プロセスを開く f_OpenProcess PROCESS_ALL_ACCESS , 1 , PId hProcess = stat // f_CloseHandle hProcess if hProcess ! 0 { // ファイル名を取得 f_GetModuleFileNameEx hProcess , hMod , varptr( gefn_filename_ ) , 2048 slen = stat if slen = 0 { // lerr = c_GetlastError() returnx |= (1<<31) | (1<<0) mes " ×GetModuleFileNameEx 関数が失敗しています。" }else{ returnx = slen mes " ○問題は存在しません" } }else{ returnx |= (1<<31) | (1<<1) mes " ×OpenProcess 関数が失敗しています。" } // プロセスを閉じる f_CloseHandle hProcess mes "  ▲ stat" mes strf(" hProcess %d " , hProcess ) mes strf(" ProcessID %d " , PId ) mes strf(" sledID %d " , sledID ) mes strf(" hMod %d " , hMod) mes "" mes strf(" FileNameLen %d " , slen ) mes strf(" filename %s " , strmid( gefn_filename_ , 0 , 100 ) ) return returnx #global GetExeFileName hwnd , filename mes filename



窓口

リンク

2010/5/14(Fri) 02:40:33|NO.32642

>>テック様
 お返事遅くなって申し訳ありません。
 私的な事情で少し立て込んでいました。

 有難うございます。解決しました。



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