Seeker's Memo

個人的で技術的かもしれないメモがメインのブログです。http://seekers.hatenablog.jp/about

C/C++言語でWindowsの環境変数/値を取得/列挙する

getenv-win.cpp

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>

int _tmain(const int argc, const TCHAR *argv[]){
	_tsetlocale(LC_ALL, _T(""));
	//	起動引数のチェック
	if(argc >= 2){
		const int BUFFER_SIZE = 2048;//よくわからんが、大きめにバッファを取る
		TCHAR buf[2048];
		//オプション(環境変数の指定)があるときの挙動
		for(int i = 1; i < argc; i++){
			DWORD ret = GetEnvironmentVariable(argv[i], buf, BUFFER_SIZE);
			if(ret != 0){
				_tprintf( _T("%s = %s\n"), argv[i], buf);
			}
			else{
				_tprintf(_T("%s = (nil)\n"), argv[i]);
			}
		}
	}
	else{//引数なしの時の挙動
		//環境変数一覧を保持する文字列ポインタ(メモリ)を取得
		LPTSTR lpEnv = GetEnvironmentStrings();
		//サーチ&表示開始
		for ( TCHAR* lpWork = lpEnv; *lpWork ; lpWork++) {
			while ( *lpWork ) { 
		    	_puttchar( *lpWork );
		    	lpWork++;
		    }
			_tprintf( _T("\n") );
		}
		//メモリ解放
		FreeEnvironmentStrings( lpEnv );
	}
	return 0;
}

で、メイクしたら試しにやってみる。以下やって見るサンプル

$ getenv-win
(設定されてるのが全部出てくる。めんどいので省略)
$ getenv-win HOME foo
HOME = D:\home
foo = (nil)

というかこれ、このままオリジナルコマンドとして常用できそう。
せっかくだし使うかなぁ……。

set | grep -i [変数名]

とかでもいいけど、ねえ?

実用的なプログラム作ったのは実はこれが初めてだったりするw
DirectXC++自作クラスラッパーライブラリとかも含めたら別だけど。
とはいえこんなもの作らなくても付属のコマンド打てば同等のことができたりするのも事実。