EnumProcesses
この関数は、現在起動中のプロセスのIDを列挙する関数です。この関数の使い方はちょっと特殊なんで簡単にコードをふまえて説明しようかと思います。(ちなみに、EnumProcessではないので注意。)
さて、特殊というのはどういうことかというとMSDNを参照すると
バッファが小さすぎてすべてのプロセス識別子を格納できなくても、それを示す手段はありません。
とのことである。ということで、必ず渡した配列よりも小さい個数になるまで配列を大きくしながらこのEnumProcessesを呼んであげる必要がある。わりとわかりにくい説明なので、実際に以下に列挙するコードを書いておく。(ちなみに、配列にはATLの
CAtlArrayを使用している)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
CAtlArray < DWORD > process_id_array; process_id_array.SetCount( 32 ); while( process_id_array.GetCount() < 4096 ) { DWORD process_id_size = 0; if( ::EnumProcesses ( process_id_array.GetData(), process_id_array.GetCount() * sizeof( DWORD ), &process_id_size ) ) { if( process_id_size / sizeof( DWORD ) != process_id_array.GetCount() ) { process_id_array.SetCount ( process_id_size / sizeof( DWORD ) ); break; } } process_id_array.SetCount ( process_id_array.GetCount() * 2 ); } |
配列サイズを初期値32から2倍しながら配列サイズに収まり切るようになったタイミングでbreakしている。また、
1 2 |
#include <Psapi.h> #pragma comment( lib, "Psapi.lib" ) |
も忘れないように。ちなみにEnumProcessesは、Windows NT 4.0 以降の2000やXP、Vistaでしか対応していない。
こうした得られたプロセスIDを使ってOpenProcessが可能であり、さらには、SetProcessWorkingSetSize・GetProcessWorkingSetSizeへと使えるのではないかと思います。