[BlueLeaf1336]> PROBLEMS> winbeads>

winbeads > PC情報(2)

historyTOP

2005/01/26:作成
2005/01/27:更新
2005/02/19:更新

ソースコードと実行ファイルはココにあります

IEの適用済みの更新を取得するTOP

次はInternet Explorerの適用済みの更新です。参考になりそうなサイトを探します。...ありませんでした。仕方がないので、いつも使わせて戴いている Donut RAPT のバージョン情報で確認できる更新の内容をコピーして、レジストリエディタで検索すると、もろにそのままの「;SP1;Q330994;Q813489;Q818529;Q822925;Q828750;Q824145;Q832894;Q837009;Q831167;Q823353;Q867801;Q833989;」なんていう値を持つキーを見つけました。

具体的には

です。ほぼ間違いなくこれでよいかと思います。というわけで、

//  ===========================================================================
//  IEの更新内容を取得する
//  ===========================================================================
function GetIEUpdate(): string;
const
    IE_KEY = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings';
    MINOR_VERSION = 'MinorVersion';
var
    Reg: TRegistry;
begin
    Result := '';
    Reg := TRegistry.Create;
    try
        //  ルートキーを設定して
        Reg.RootKey := HKEY_LOCAL_MACHINE;
        //  説明書どおりのキーを開く(ない場合に作らないように)
        if Reg.OpenKeyReadOnly(IE_KEY) then
        begin
            Result := Reg.ReadString(MINOR_VERSION);
        end;
    finally
        Reg.Free;
    end;
end;

画面解像度の取得TOP

参考サイト

//  ===========================================================================
//  画面の表示能力
//  http://homepage1.nifty.com/MADIA/delphi/Win32API/kaizoudo.htm
//  http://www.borland.co.jp/tips/delphi/dh008/
//  ===========================================================================
function GetScreenAbility(): string;
var
    DesktopWND: HWND;
    DesktopDC: HDC;
begin
    //  デスクトップのデバイスコンテキストハンドルを取得
    DesktopWND := GetDesktopWindow;
    DesktopDC := GetDC(DesktopWND);
    //  画面能力を取得
    try
        Result := Format('%dpx(%dmm)×%dpx(%dmm) %dbits',[
            GetDeviceCaps(DesktopDC, HORZRES),
            GetDeviceCaps(DesktopDC, HORZSIZE),
            GetDeviceCaps(DesktopDC, VERTRES),
            GetDeviceCaps(DesktopDC, VERTSIZE),
            GetDeviceCaps(DesktopDC, BITSPIXEL)
        ]);
    finally
        ReleaseDC(DesktopWND, DesktopDC);
    end;
end;

メモリに関する情報の取得TOP

物理メモリとかページファイルとかのアレです。参考サイトを以下に。

(※2005/02/19)なぜ関数にしているんだろう。しかも戻り値に関する処理がコレッポッチもない。

//  ===========================================================================
//  メモリの情報
//  http://hp.vector.co.jp/authors/VA009712/take/delphi/kabesys.htm#getmemory
//  http://forum.nifty.com/fdelphi/samples/01380.html
//  http://community.borland.com/article/0,1410,16582,00.html
//  ===========================================================================
function GetMemoryStatus(var Phys, Page, Virt: string): string;
procedure GetMemoryStatus(var Phys, Page, Virt: string);
var
    MemoryStatus: TMemoryStatus;
begin
    //  メモリ情報を得る
    FillChar(MemoryStatus, SizeOf(MemoryStatus), 0);
    MemoryStatus.dwLength := SizeOf(TMemoryStatus);
    GlobalMemoryStatus(MemoryStatus);

    //  取り出し
    with MemoryStatus do
    begin
        Phys := Format('全体 %s | 使用 %s | 空き %s',
                        [B2KB(dwTotalPhys),
                         B2KB(dwTotalPhys - dwAvailPhys),
                         B2KB(dwAvailPhys)]);
        Page := Format('全体 %s | 使用 %s | 空き %s',
                        [B2KB(dwTotalPageFile),
                         B2KB(dwTotalPageFile - dwAvailPageFile),
                         B2KB(dwAvailPageFile)]);
        Virt := Format('全体 %s | 使用 %s | 空き %s',
                        [B2KB(dwTotalVirtual),
                         B2KB(dwTotalVirtual - dwAvailVirtual),
                         B2KB(dwAvailVirtual)]);
    end;
end;

こんな感じですか? とりあえずまるままコピーというのは避けています。さすがに。似たようなもんですけど。それから、全てエラー処理が適当すぎます。でも失敗しても別にねぇ。

ディスクに関する情報の取得TOP

コレはやったことがあります。が、原典の表示が全くないので改めて調べなおしてみました。ここでは、ディスクに関する情報として、、最低限、全ドライブの表示、ディスクの種類、全容量、空き容量、ファイルシステム名称、それからシステムドライブかどうかを取得するものとします。それ以外に何か表示できるものがあればそれはそれとします。

途中ですが、今日はココまでにします。

続きです。よいかんじのページを見つけたりしました。

//  ===========================================================================
//  ドライブの情報
//  http://www.borland.co.jp/qanda/delphi/d0009389.html
//  http://homepage1.nifty.com/MADIA/delphi/Win32API/GetDrives.htm
//  http://forum.nifty.com/fdelphi/faq/00116.htm
//  http://www.borland.co.jp/qanda/delphi/d0002383.html
//  http://hp.vector.co.jp/authors/VA009712/take/delphi/kabesys.htm#gethdd
//  http://www.users.gr.jp/ml/archive/viewer.aspx?name=delphi&no=24099
//  ===========================================================================
function GetDriveStatus(): string;

    //  ---------------------------------------------
    //  システムドライブの取得
    function GetSystemDrive(): char;
    var
        s: string;
    begin
        s := ExtractFileDrive(GetWindowsDirectory());
        if (s <> '') then Result := s[1] else Result := #0;
    end;

    //  ---------------------------------------------
    //  利用可能なドライブ文字列の列挙
    function AvailableDrives(): string;
    var
        ld: DWORD;
        i: integer;
    begin
        Result := '';
        ld := GetLogicalDrives;
        for i := 0 to 25 do
        begin
            if (ld and (1 shl i)) > 0 then Result := Result + (Char(Ord('A') + i));
        end;
    end;
    //  ---------------------------------------------
    //  ディスクドライブの種類を取得
    function GetDriveType(Drive: Char): string;
    var
        DriveType: Byte;
    begin
        DriveType := Windows.GetDriveType(PChar(Drive + ':\'));
        case DriveType of
            DRIVE_REMOVABLE: Result := 'REMOVABLE     ';
            DRIVE_FIXED    : Result := 'HARDDISK      ';
            DRIVE_REMOTE   : Result := 'NETWORK_DRIVE ';
            DRIVE_CDROM    : Result := 'CD-ROM        ';
            DRIVE_RAMDISK  : Result := 'RAMDISK       ';
        end;
    end;
    //  ---------------------------------------------
    //  ボリューム名の取得
    function GetVolumeName(Drive: Char): string;
    var
        shfi: TSHFileInfo;
    begin
        SHGetFileInfo(PChar(Drive + ':\'), 0, shfi, SizeOf(shfi), SHGFI_DISPLAYNAME);
        Result := shfi.szDisplayName;
    end;
    //  ---------------------------------------------
    //  ドライブ文字列をDiskFree/DiskSizeで使用できる数値表示に変換
    function DriveCharToByte(Drive: Char): Byte;
    const
        DRIVES = '#ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    begin
        //カレントドライブ=0、A=1、B=2、C=3、
        Result := Pos(UpCase(Drive), DRIVES) - 1;
    end;
    //  ---------------------------------------------
    //  指定ディスクの総容量(バイト)取得
    function GetDiskSize(Drive: Char): Int64;
    begin
        Result := DiskSize(DriveCharToByte(Drive));
    end;
    //  ---------------------------------------------
    //  指定ディスクの空き容量(バイト)取得
    function GetDiskFree(Drive: Char): Int64;
    begin
        Result := DiskFree(DriveCharToByte(Drive));
    end;
    //  ---------------------------------------------
    //  ファイルシステムなど
    function GetFileSystem(Drive: Char): string;
    const
        BUF_SIZE = 260;
    var
        VolumeNameBuffer: array[0..BUF_SIZE-1] of char;
        VolumeSerialNumber: DWORD;
        MaximumComponentLength: DWORD;
        FileSystemFlags: DWORD;
        FileSystemNameBuffer: array[0..BUF_SIZE-1] of char;
    begin
        if (Trim(GetDriveType(Drive)) <> 'HARDDISK') then Result := ''
        else
        begin
            GetVolumeInformation(
                PChar(Drive + ':\'),
                VolumeNameBuffer, BUF_SIZE,
                @VolumeSerialNumber,
                MaximumComponentLength,
                FileSystemFlags,
                FileSystemNameBuffer, BUF_SIZE
            );
            Result := FileSystemNameBuffer;
        end;
    end;

var
    Mode: Word;
    Drives, Line: string;
    Drive, SysDrive, Check: char;
    i: integer;
    Total, Avail: Int64;
begin
    Mode := SetErrorMode(SEM_FAILCRITICALERRORS);
    Result := '';
    SysDrive := GetSystemDrive();
    Drives := AvailableDrives();
    for i := 1 to Length(Drives) do
    begin
        Drive := Drives[i];
        if (Drive = SysDrive) then Check := '*' else Check := ' ';
        Total := GetDiskSize(Drive);
        Avail := GetDiskFree(Drive);
        Line := Format('%s:\(%s) (%s) %s %s | 全体 %s | 使用 %s | 空き %s',
                [Drive,
                 Check,
                 GetDriveType(Drive),
                 GetVolumeName(Drive),
                 GetFileSystem(Drive),
                 B2KB(Total),
                 B2KB(Total - Avail),
                 B2KB(Avail)
                ]);
        Result := Result + #13#10 + Line;
    end;
    Result := Trim(Result);
    SetErrorMode(Mode);
end;

いわゆるかき集めただけです。ところで、お手本のプログラムでは「OEM Manufacturer」「OEM Model」なるものが表示されているのですが、今使っている何かからは取得できないようですので、飛ばします。意味もわかりませんし。

というところで、PC情報に関してはここまでとします。どこまでがPC情報か、というのは微妙なところですが...。次はCPU情報にうつります。手掛かりがなさそうで力尽きる予感がしますが。

EOFTOP