[BlueLeaf1336]> DOWNLOAD> UnUtility>

モジュール使用状況リファレンス DllReference

historyTOP

2006/09/04:作成

downloadTOP

最新版:DllReference20060904.zip(209,342bytes)※ソースコードと実行ファイルです。

overviewTOP

起動中のプロセスの一覧をアプリケーションファイルのフルパスで表示して、それぞれのプロセスが使っているDLLファイルもツリーの子ノードとして一覧します。

ついでに、使われているDLLから見た使っているEXEの一覧(意味わかりにくいですが)も表示します。

このプログラム自体の用途は不明です。

ちょっとした工夫としては、システム系のプロセスも列挙できるように、AdjustTokenPrivileges を使って(多分)最強の権限を割り当てていることぐらいです。

screenshotTOP

起動するとこの画面を表示します。これは、起動しているプロセスをフルパスに直して一覧し、その子ノードとして、そのプロセスが使っているDLLを一覧したものです。

「最新の状態に更新」を押すと、起動プロセスの列挙からやり直します。

そういえば、[System Process] のプロセス情報を取得するとプログラムのパスとして、なぜかこのプログラム(DllReference.exe)のフルパスを取得してしまいます。理由がわからないし、どうせテスト用のプログラムなのでしょうもない調整(そこだけ一覧からはずす)はやっていません。

こっちが、使われているDLLを一覧し、その子ノードとして、使っているプロセスを一覧したものです。

説明しながら、一切まったくこれっぽっちも用途がわかりません。ひょっとしたら...やっぱり思いつきません。

結局のところ、CreateToolhelp32Snapshot の使い方を練習しただけという感じです。

DllReference20060904.zip(209,342bytes)※ソースコードと実行ファイルです。

codeTOP

あまりに面白くないので、プロセスの列挙とモジュールの列挙をするときの処理を貼り付けます。

//-----------------------------------------------------------------------------
//  プロセス一覧を取得
//  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;

と宣言している関数です。こんな風にした気持ちは、列挙する処理と実際にくちゃくちゃする処理を分離したいな、程度のものです。実際の使い方(が、もし必要なら)は、ファイルをダウンロードして確認してください。

EOFTOP