モジュール情報を取得するにはModule32First()、Module32Next()関数を使います。
手順は次のようになります。(戻る)
- モジュール情報を含むスナップショットを作成(CreateToolhelp32Snapshot)
- 最初のモジュール情報を取得(Module32First)
- 続きのモジュール情報を取得(Module32Next)
- スナップショットを破棄(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をインクルードして下さい。
※コメント投稿者のブログIDはブログ作成者のみに通知されます