プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

モジュール情報の一覧

2007年10月03日 10時26分00秒 | パフォーマンス関連

モジュール情報を取得するにはModule32First()Module32Next()関数を使います。
手順は次のようになります。(戻る)

  1. モジュール情報を含むスナップショットを作成(CreateToolhelp32Snapshot)
  2. 最初のモジュール情報を取得(Module32First)
  3. 続きのモジュール情報を取得(Module32Next)
  4. スナップショットを破棄(CloseHandle)

プロトタイプ宣言

BOOL Module32First(
    HANDLE hSnapshot,                   // スナップショットのハンドル
    LPMODULEENTRY32 lpme                // モジュール情報の格納構造体
);

BOOL Module32Next(
    HANDLE              hSnapshot,      // スナップショットのハンドル
    LPMODULEENTRY32     lpme            // モジュール情報の格納構造体
);

構造体

typedef struct tagMODULEENTRY32 {
    DWORD   dwSize;                             // 構造体のサイズ
    DWORD   th32ModuleID;                       // モジュールID
    DWORD   th32ProcessID;                      // プロセスID
    DWORD   GlblcntUsage;                       // グローバルでのモジュール参照カウント数
    DWORD   ProccntUsage;                       // プロセス内でのモジュール参照カウント数
    BYTE  * modBaseAddr;                        // モジュールのベースアドレス
    DWORD   modBaseSize;                        // モジュールのバイトサイズ
    HMODULE hModule;                            // モジュールのハンドル
    char    szModule[ MAX_MODULE_NAME32 + 1 ];  // ファイル名(実行モジュール名)
    char    szExePath[ MAX_PATH ];              // パス名
} MODULEENTRY32, *LPMODULEENTRY32;

サンプル

#include <stdio.h>
#include <windows.h>
#include <tlhelp32.h>

// メイン関数
int main( void )
{
    static LPCTSTR Msg[] = {
        TEXT(" No. [szModule            ] [szExePath                                                                                 ] ")
        TEXT("ModuID ProcID GloUse PrcUse  hModule BaseAddr BaseSize\n"),
        
        TEXT("---- ---------------------- -------------------------------------------------------------------------------------------- ")
        TEXT("------ ------ ------ ------ -------- -------- --------\n"),
    };
    DWORD   dwPID = GetCurrentProcessId();
    HANDLE  hSnapshot;
    INT     nCount = 0;
    
    if ( (hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPID)) != INVALID_HANDLE_VALUE ){
        MODULEENTRY32 me32;
        me32.dwSize = sizeof( MODULEENTRY32 );
        printf( Msg[0] );
        printf( Msg[1] );
        
        if ( Module32First(hSnapshot,&me32) ){
            do {
                printf( TEXT("%3d: "),          ++nCount );
                printf( TEXT("[%-20s] "),       me32.szModule );
                printf( TEXT("[%-90.89s] "),    me32.szExePath );
                printf( TEXT("%6d "),           me32.th32ModuleID );
                printf( TEXT("%6d "),           me32.th32ProcessID );
                printf( TEXT("%6d "),           me32.GlblcntUsage );
                printf( TEXT("%6d "),           me32.ProccntUsage );
                printf( TEXT("%p "),            me32.hModule );
                printf( TEXT("%p "),            me32.modBaseAddr );
                printf( TEXT("%8d\n"),          me32.modBaseSize );
            } while ( Module32Next(hSnapshot,&me32) );
        }
        CloseHandle( hSnapshot );
        printf( Msg[1] );
    }
    printf( "モジュール数:%d個\n", nCount );
    return 0;
}
  • ヘッダファイルとしてtlhelp32.hをインクルードして下さい。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プロセス/スレッド数の取得 | トップ | プロセス情報の一覧 »
最新の画像もっと見る

コメントを投稿

パフォーマンス関連」カテゴリの最新記事