[BlueLeaf1336]> DOWNLOAD> UnUtility>
history | TOP |
2006/09/04:作成
download | TOP |
最新版:DllReference20060904.zip(209,342bytes)※ソースコードと実行ファイルです。
overview | TOP |
起動中のプロセスの一覧をアプリケーションファイルのフルパスで表示して、それぞれのプロセスが使っているDLLファイルもツリーの子ノードとして一覧します。
ついでに、使われているDLLから見た使っているEXEの一覧(意味わかりにくいですが)も表示します。
このプログラム自体の用途は不明です。
ちょっとした工夫としては、システム系のプロセスも列挙できるように、AdjustTokenPrivileges を使って(多分)最強の権限を割り当てていることぐらいです。
screenshot | TOP |
起動するとこの画面を表示します。これは、起動しているプロセスをフルパスに直して一覧し、その子ノードとして、そのプロセスが使っているDLLを一覧したものです。
「最新の状態に更新」を押すと、起動プロセスの列挙からやり直します。
そういえば、[System Process] のプロセス情報を取得するとプログラムのパスとして、なぜかこのプログラム(DllReference.exe)のフルパスを取得してしまいます。理由がわからないし、どうせテスト用のプログラムなのでしょうもない調整(そこだけ一覧からはずす)はやっていません。
こっちが、使われているDLLを一覧し、その子ノードとして、使っているプロセスを一覧したものです。
説明しながら、一切まったくこれっぽっちも用途がわかりません。ひょっとしたら...やっぱり思いつきません。
結局のところ、CreateToolhelp32Snapshot の使い方を練習しただけという感じです。
DllReference20060904.zip(209,342bytes)※ソースコードと実行ファイルです。
code | TOP |
あまりに面白くないので、プロセスの列挙とモジュールの列挙をするときの処理を貼り付けます。
//----------------------------------------------------------------------------- // プロセス一覧を取得 // http://nienie.com/~masapico/api_sample_ps05_c.html // http://nienie.com/~masapico/api_EnumProcesses.html // http://support.microsoft.com/default.aspx?scid=kb;ja;JP175030 // http://www.borland.co.jp/qanda/delphi/d0003287.html // http://www2.big.or.jp/~osamu/Delphi/Tips/key.cgi?key=13 procedure SnapShotProcess(CallBack: TProcessFound; const CallBackVar: TObject); var SnapShot: THandle; PE32: TProcessEntry32; begin // 構造体の初期化 FillChar(PE32, SizeOf(PE32), 0); PE32.dwSize := SizeOf(PE32); try // システム中の情報のスナップショットをとる SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 成功した場合 if (SnapShot <> INVALID_HANDLE_VALUE) then begin try // 最初のプロセスの検索 if Process32First(SnapShot, PE32) then begin // 通知 repeat if CallBack(PE32, False, '', CallBackVar) then Break; // 次のプロセスの検索 until not Process32Next(SnapShot, PE32); end // 検索失敗 else CallBack(PE32, False, '', CallBackVar); finally CloseHandle(SnapShot); end; end // 失敗した場合 else begin CallBack(PE32, True, SysErrorMessage(GetLastError()), CallBackVar); end; except on E: Exception do CallBack(PE32, True, E.Message, CallBackVar); end; end; //----------------------------------------------------------------------------- // 指定したプロセスのモジュール一覧を取得 procedure SnapShotModule(const ProcessEntry: TProcessEntry32; CallBack: TModuleFound; const CallBackVar: TObject); var SnapShot: THandle; ME32: TModuleEntry32; begin // 構造体の初期化 FillChar(ME32, SizeOf(ME32), 0); ME32.dwSize := SizeOf(ME32); try // プロセスの使用しているモジュールを列挙 SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessEntry.th32ProcessID); // 成功した場合 if (SnapShot <> INVALID_HANDLE_VALUE) then begin try // 最初のモジュールの検索 if Module32First(SnapShot, ME32) then begin // 通知 repeat if CallBack(ME32, False, '', CallBackVar) then Break; // 次のモジュールの検索 until not Module32Next(SnapShot, ME32); end // 検索失敗 else CallBack(ME32, False, '', CallBackVar); finally CloseHandle(SnapShot); end; end // 失敗した場合 else begin CallBack(ME32, True, SysErrorMessage(GetLastError()), CallBackVar); end; except on E: Exception do CallBack(ME32, True, E.Message, CallBackVar); end; end;
ここで、TProcessFound と TModuleFound というのは
type // プロセスが見つかったときに呼び出してほしい関数型定義 TCancel = Boolean; TProcessFound = function(const ProcessEntry: TProcessEntry32; const Err: Boolean; const ErrText: string; const Data: TObject): TCancel of object; TModuleFound = function(const ModuleEntry: TModuleEntry32; const Err: Boolean; const ErrText: string; const Data: TObject): TCancel of object;
と宣言している関数です。こんな風にした気持ちは、列挙する処理と実際にくちゃくちゃする処理を分離したいな、程度のものです。実際の使い方(が、もし必要なら)は、ファイルをダウンロードして確認してください。
EOF | TOP |