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