[BlueLeaf1336]> PROGRAM>

WindowsXP に適用済みの HotFix の一覧を取得する XpHotFixCheker

historyTOP

2006/12/21:作成

はじめにTOP

The Code Project を流し読みしていると、こんな記事がありました。

やっていることは、レジストリのそれなりの場所を読み出しているだけですが、最近プログラミングから徐々に遠ざかってしまっている身にしてみると、チョットしたリハビリになりそうなので、Delphi に翻訳してみました。

ダウンロードTOP

XpHotFixCheker20061221.zip(71,627Bytes) ソースコードと実行ファイルです。

今回は、コンソールアプリケーションにしてみたので、サイズが小さくなっています。でも、本筋と関係ない内容を出力しようとして、サイズを無駄遣いしています。それに、レジストリアクセスのために横着して Registry を uses してしまったので、これまたサイズが大きい原因となっています。

サンプルTOP

今使っているノートパソコンで実行してみると、こんな感じになります。定期的に WindowsUpdate を行っているので結構たまってきています。

WindowsXP HotFix情報取得サンプル
XpHotFixChecker.exe Ver.0.6.12.21

Windows XP Home Edition Service Pack 2 (Build 2600)

[KB867282] Windows XP ホットフィックス - KB867282
[KB873339] Windows XP ホットフィックス - KB873339
[KB885250] Windows XP ホットフィックス - KB885250
[KB885835] Windows XP ホットフィックス - KB885835
[KB885836] Windows XP ホットフィックス - KB885836
[KB885884] Windows XP ホットフィックス - KB885884
[KB886185] Windows XP ホットフィックス - KB886185
[KB886677] Windows XP ホットフィックス - KB886677
[KB887472] Windows XP ホットフィックス - KB887472
[KB887742] Windows XP ホットフィックス - KB887742
[KB888113] Windows XP ホットフィックス - KB888113
[KB888302] Windows XP ホットフィックス - KB888302
[KB890046] Windows XP セキュリティ更新 (KB890046)
[KB890047] Windows XP ホットフィックス - KB890047
[KB890175] Windows XP ホットフィックス - KB890175
[KB890859] Windows XP ホットフィックス - KB890859
[KB890923] Windows XP ホットフィックス - KB890923
[KB891781] Windows XP ホットフィックス - KB891781
[KB893066] Windows XP セキュリティ更新 (KB893066)
[KB893086] Windows XP ホットフィックス - KB893086
[KB893756] Windows XP セキュリティ更新 (KB893756)
[KB893803] Windows Installer 3.1
[KB893803v2] Windows Installer 3.1
[KB894391] Windows XP 更新 (KB894391)
[KB896358] Windows XP セキュリティ更新 (KB896358)
[KB896422] Windows XP セキュリティ更新 (KB896422)
[KB896423] Windows XP セキュリティ更新 (KB896423)
[KB896424] Windows XP セキュリティ更新 (KB896424)
[KB896428] Windows XP セキュリティ更新 (KB896428)
[KB896688] Windows XP セキュリティ更新 (KB896688)
[KB898461] Windows XP 更新 (KB898461)
[KB899587] Windows XP セキュリティ更新 (KB899587)
[KB899591] Windows XP セキュリティ更新 (KB899591)
[KB900485] Windows XP 更新 (KB900485)
[KB900725] Windows XP セキュリティ更新 (KB900725)
[KB901017] Windows XP セキュリティ更新 (KB901017)
[KB901190] Windows XP セキュリティ更新 (KB901190)
[KB901214] Windows XP セキュリティ更新 (KB901214)
[KB902400] Windows XP セキュリティ更新 (KB902400)
[KB904706] Windows XP セキュリティ更新 (KB904706)
[KB904942] Windows XP 更新 (KB904942)
[KB905414] Windows XP セキュリティ更新 (KB905414)
[KB905749] Windows XP セキュリティ更新 (KB905749)
[KB905915] Windows XP セキュリティ更新 (KB905915)
[KB908519] Windows XP セキュリティ更新 (KB908519)
[KB908531] Windows XP セキュリティ更新 (KB908531)
[KB910437] Windows XP 更新 (KB910437)
[KB911280] Windows XP セキュリティ更新 (KB911280)
[KB911562] Windows XP セキュリティ更新 (KB911562)
[KB911564] Windows Media Player (KB911564) セキュリティ問題の修正プログラム
[KB911565] Windows Media Player 10 (KB911565) セキュリティ問題の修正プログラム
[KB911567] Windows XP セキュリティ更新 (KB911567)
[KB911927] Windows XP セキュリティ更新 (KB911927)
[KB912812] Windows XP セキュリティ更新 (KB912812)
[KB912919] Windows XP セキュリティ更新 (KB912919)
[KB913446] Windows XP セキュリティ更新 (KB913446)
[KB913580] Windows XP セキュリティ更新 (KB913580)
[KB914388] Windows XP セキュリティ更新 (KB914388)
[KB914389] Windows XP セキュリティ更新 (KB914389)
[KB914440] Windows XP ホットフィックス (KB914440)
[KB915865] Hotfix for Windows XP (KB915865)
[KB916281] Windows XP セキュリティ更新 (KB916281)
[KB916595] Windows XP 更新 (KB916595)
[KB917159] Windows XP セキュリティ更新 (KB917159)
[KB917344] Windows XP セキュリティ更新 (KB917344)
[KB917422] Windows XP セキュリティ更新 (KB917422)
[KB917734_WMP10] Windows Media Player 10 (KB917734) セキュリティ問題の修正プログラム
[KB917953] Windows XP セキュリティ更新 (KB917953)
[KB918439] Windows XP セキュリティ更新 (KB918439)
[KB918899] Windows XP セキュリティ更新 (KB918899)
[KB919007] Windows XP セキュリティ更新 (KB919007)
[KB920213] Windows XP セキュリティ更新 (KB920213)
[KB920214] Windows XP セキュリティ更新 (KB920214)
[KB920670] Windows XP セキュリティ更新 (KB920670)
[KB920683] Windows XP セキュリティ更新 (KB920683)
[KB920685] Windows XP セキュリティ更新 (KB920685)
[KB920872] Windows XP 更新 (KB920872)
[KB921398] Windows XP セキュリティ更新 (KB921398)
[KB921883] Windows XP セキュリティ更新 (KB921883)
[KB922582] Windows XP 更新 (KB922582)
[KB922616] Windows XP セキュリティ更新 (KB922616)
[KB922760] Windows XP セキュリティ更新 (KB922760)
[KB922819] Windows XP セキュリティ更新 (KB922819)
[KB923191] Windows XP セキュリティ更新 (KB923191)
[KB923414] Windows XP セキュリティ更新 (KB923414)
[KB923689] Windows XP (KB923689) セキュリティ問題の修正プログラム
[KB923694] Windows XP セキュリティ更新 (KB923694)
[KB923980] Windows XP セキュリティ更新 (KB923980)
[KB924191] Windows XP セキュリティ更新 (KB924191)
[KB924270] Windows XP セキュリティ更新 (KB924270)
[KB924496] Windows XP セキュリティ更新 (KB924496)
[KB925398_WMP64] Windows Media Player 6.4 (KB925398) セキュリティ問題の修正プログラム
[KB925486] Windows XP セキュリティ更新 (KB925486)
[KB926255] Windows XP セキュリティ更新 (KB926255)
[Q147222] 

Found 95 Hot-Fix

しくみTOP

「ファイル名を指定して実行」で「regedit」と入力してレジストリエディタを立ち上げて

HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Windows NT¥CurrentVersion¥HotFix

にアクセスしてみれば、そこにホットフィックスの一覧があるのが確認できます。また画面右側の「Fix Description」や「Comments」といったキーの値に、そのホットフィックスのもう少しだけましな説明が書いてあるのがわかります。

これらの値を Delphi で読み出しているだけです。オリジナルより少しだけましなのは、「Fix Description」ではなく「Comments」を読み出している点だけです。

ソースコードTOP

このページでは説明していない関数を使っていますが、本題ではないので暇で暇で仕方がないときにソースコードを参照するとして、上で説明した内容を実行している部分を載せておきます。

const
    KEY_HOTFIX = 'Software\Microsoft\Windows NT\CurrentVersion\HotFix';
var
    LRegistry: TRegistry;
    LEnumKeys: TStringList;
    i: Integer;
    LSubKey: String;
    LHotFixName: String;
begin
    //  EXE情報出力
    Writeln(GetVersionInfo('FileDescription', ParamStr(0)));
    Writeln(
        ExtractFileName(ParamStr(0))
        + ' ' + Format('Ver.%s', [GetVersionInfo('FileVersion', ParamStr(0))])
        );
    Writeln;

    //  OSバージョン出力
    Writeln(StringReplace(GetOsInfo(), 'Microsoft ', '', []));
    Writeln;

    //  HotFix一覧出力
    LRegistry := TRegistry.Create();
    LEnumKeys := TStringList.Create();
    try
        //  ルートキーを設定
        LRegistry.RootKey := HKEY_LOCAL_MACHINE;

        //  読み取り専用で開く
        if (LRegistry.OpenKeyReadOnly(KEY_HOTFIX)) then
        begin
            try
                //  配下のキーを列挙
                LRegistry.GetKeyNames(LEnumKeys);
            finally
                //  レジストリを閉じる
                LRegistry.CloseKey();
            end;

            //  配下のキーを読み出せた場合
            for i := 0 to LEnumKeys.Count - 1 do
            begin
                //  キーの名称を取り出して
                LSubKey := LEnumKeys.Strings[i];

                //  改めて読み取り専用で開く
                if (LRegistry.OpenKeyReadOnly(KEY_HOTFIX + '\' + LSubKey)) then
                begin
                    try
                        //  オリジナルのソースでは 'Fix Description' にアクセスしている
                        //LHotFixName := LRegSub.ReadString('Fix Description');
                        //  少なくとも日本語版では 'Comments' の方が情報量が多い
                        LHotFixName := '[' + LSubKey + '] ' + LRegistry.ReadString('Comments');
                        //  コンソールに出力
                        WriteLn(LHotFixName);
                    finally
                        //  閉じる
                        LRegistry.CloseKey();
                    end;
                end;
            end;
        end;

        Writeln;
        Writeln(Format('Found %d Hot-Fix', [LEnumKeys.Count]));

     finally
        LRegistry.Free();
        LEnumKeys.Free();
    end;

    //  即終了するのをせきとめる
    //Readln;
end.

EOFTOP