標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

Windows のバージョンナンバーを得る Go パッケージを作成しました。

仕様は簡単で、readme にあるように osversion.Query() を呼べば、OS のバージョン情報を格納した構造体へのポインタが帰ってきます。 ( Windows 以外の OS だと、バージョンナンバーはどれもゼロになります)

どういうことをやっているかというと、Windowsバージョンを取得する(RtlGetVersion) というページに書いてあるまんまで、ntdll.dll という DLL の RtlGetVersion という API を呼んでいるだけです。

この API は本来デバイスドライバー向けのものらしく、C++ からコレを呼ぶ場合、DDK等をインストールしてヘッダーファイルやライブラリをインストールしなければいけないそうです。それ故、件のページのサンプルコードでは DLL をプログラム的にロードして呼び出していたりします。Windows の Go 言語では、そういうのはむしろ得意なんで、さくっと真似できました。

Windows では、他にバージョンを得る API には GetVersionEx とか VerfyVersionInfo などがあります。これらは実行ファイルにマニフェストファイルを添えておかないと、Windows10 でも Windows 8 のフリをします。どうも、Microsoft 的には OS のバージョンで挙動を変えてほしくあくて、GetFileVersion などで関係する個々の DLL のバージョンを見て動作を変えて欲しいようです。

そないなこと言うても、どの DLL のどのバージョンから、どの機能がサポートされたかなんて、判別するのは難しいですよ…せんせい…

(追記)

これを書いたのは、そもそもはコマンドプロンプトエスケープシーケンスを使えるかとうかをOSバージョンで判定するためだったんですが、使えない場合は SetConsoleMode でエラーが返ってくるからOSバージョンをわざわざ見る必要なしと気づいた俺達は…