Windows7で、プロダクトIDを取得するには?

解決


おう  2012-10-14 17:50:21  No: 43188  IP: 192.*.*.*

お世話になっております。

Delphi2007,Windows7です。


WindowsのプロダクトIDを取得しようとしていますが、できません。

調べたところ、レジストリの

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductId

の値を取得すればいい、とのことでしたが、取得できません。

試しに、ProductId ではなく、RegisteredOwner を取得しようとしたら、できました。

ProductIdは、特別な方法があるのでしょうか?

よろしくお願いします。

以下がコードです。

-------------------------------------------------------

(Button1とMemo1を配置しました)


procedure TForm1.Button1Click(Sender: TObject);
var
 AppKey:string;

 Reg:TRegistry;
begin

 AppKey:='\SOFTWARE\Microsoft\Windows NT\CurrentVersion';

 Reg:=TRegistry.Create;
 Reg.Access:=KEY_READ;
 with Reg do
 begin
  try
    RootKey:=HKEY_LOCAL_MACHINE;

    if OpenKey(AppKey,false) then
    begin

     memo1.text:=ReadString('ProductId');

    end;
  finally

    Free;

  end;

 end;

end;

編集 削除
Mr.XRAY  2012-10-14 23:17:20  No: 43189  IP: 192.*.*.*

こんちには,

>Delphi2007,Windows7です。

確かに環境は書いてあるのですが,Windows 7 だけでは情報不足ですね.
64 bit 版じゃないのですか ?

だと仮定して,
Window 7 U64 で,Delphi XE を使用して,64 bit のレジストリから ProductId を
取得できることを確認しました.
参考記事です.

[D2007 32bitアプリから64ビットのRegistryアクセス]
https://www.petitmonte.com/bbs/answers?question_id=7603

もし,32 bit 版だったらゴメンなさい.って,私が謝る必要はないですよね.
元々情報が提供されていないのですから.

編集 削除
おう  2012-10-15 00:37:31  No: 43190  IP: 192.*.*.*

お返事ありがとうございます。

環境情報が抜けていましたが、64 bitです。


参考記事を参考にすると、
Registry := TRegistry.Create(任意のアクセス or KEY_WOW64_64KEY);
とあるので、

Reg:=TRegistry.Create;
の部分を、
Reg:=TRegistry.Create(任意のアクセス or KEY_WOW64_64KEY);
にしたらよいのでしょうか?

任意のアクセス って、何でしょうか?

編集 削除
Mr.XRAY  2012-10-15 00:43:35  No: 43191  IP: 192.*.*.*

>任意のアクセス って、何でしょうか?

 Reg:=TRegistry.Create;
 Reg.Access:=KEY_READ;  //任意のアクセス
 
    ↓
 Reg:=TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
// Reg.Access:=KEY_READ;  //任意のアクセス

ということですね.

教訓
問題が解決したら,この掲示板を参考にしている方のためにも,
是非,サマリーを書きましょう.

編集 削除
Mr.XRAY  2012-10-15 00:47:15  No: 43192  IP: 192.*.*.*

ちなみに,定数 KEY_WOW64_64KEY は Delphi 2007にもあります.
Windows.pas 内にあります.

編集 削除
おう  2012-10-16 01:40:24  No: 43193  IP: 192.*.*.*

お返事ありがとうございます。

プロダクトIDを取得することができました。

また、任意のアクセスについても、わかりました。

サマリーは、ソースコードを書くことでよろしいでしょうか?

以下がコードです。

-------------------------------------------------------

(Button1とMemo1を配置しました)

procedure TForm1.Button1Click(Sender: TObject);
var
 AppKey:string;

 Reg:TRegistry;
begin

 AppKey:='\SOFTWARE\Microsoft\Windows NT\CurrentVersion';

 Reg:=TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);

 with Reg do
 begin
  try
    RootKey:=HKEY_LOCAL_MACHINE;

    if OpenKey(AppKey,false) then
    begin

     memo1.text:=ReadString('ProductId');

    end;
  finally

    Free;

  end;

 end;

end;

-------------------------------------------------------

ところで、このプログラムが動くパソコンが、32ビットか64ビットかどうかを知る方法はあるでしょうか?

探してみましたが、わかりませんでした。

Windows7かVistaかXPかを調べるには、CurrentVersionを調べたらよいのかな、と思いますが、それでよろしいでしょうか?

編集 削除
DEKO  2012-10-16 01:44:24  No: 43194  IP: 192.*.*.*

>このプログラムが動くパソコンが、32ビットか64ビットかどうかを知る方法はあるでしょうか?

[Windowsのビット数を取得する方法を教えて下さい。(Delphi Q&A)]
https://www.petitmonte.com/bbs/answers?question_id=7779

編集 削除
おう  2012-10-16 21:50:43  No: 43195  IP: 192.*.*.*

お返事ありがとうございます。

レジストリの、このキーを見ればいい、ということではないようですね。

英語が苦手なので、教えていただいたサイトを調べるのに、もうちょっと時間がかかりそうです。

もうちょっと調べてみます。

Windows7かVistaかXPかを調べる方法も、CurrentVersionではないようでしたね。

この部分も、簡単ではないようなので、もうちょっと調べてみます。

編集 削除
おう  2012-10-16 21:50:44  No: 43196  IP: 192.*.*.*

お返事ありがとうございます。

レジストリの、このキーを見ればいい、ということではないようですね。

英語が苦手なので、教えていただいたサイトを調べるのに、もうちょっと時間がかかりそうです。

もうちょっと調べてみます。

Windows7かVistaかXPかを調べる方法も、CurrentVersionではないようでしたね。

この部分も、簡単ではないようなので、もうちょっと調べてみます。

編集 削除
DEKO  2012-10-17 07:46:26  No: 43197  IP: 192.*.*.*

> Windows7かVistaかXPかを調べる方法

簡易的には Win32MinorVersion と Win32MinorVersion を調べればいいです。

var
  Dmy: string;
begin
  case Win32MajorVersion of
    5:case Win32MinorVersion of
        0:Dmy := '2000';
        1:Dmy := 'XP';
        2:Dmy := 'XP (x64) / Server 2003 / Server 2003 R2';
      end;
    6:case Win32MinorVersion of
        0:Dmy := 'Vista / Server 2008';
        1:Dmy := '7 / Server 2008 R2';
        2:Dmy := '8';
      end;
  else
    Dmy := 'Unknown';
  end;
  ShowMessage(Dmy);
end;


"XP 以降" のようにざっくり調べればいいのなら、CheckWin32Version() を使います。

  if CheckWin32Version(5, 1) then
    ShowMessage('XP またはそれ以降')
  else
    ShowMessage('XP 以前');

XE2 以降なら OSX も含めて TOSVersion レコードで調べられます。

var
  Dmy: string;
begin
  case TOSVersion.Platform of
    pfWindows:
      begin
        case TOSVersion.Major of
          5:case Win32MinorVersion of
              0:Dmy := '2000';
              1:Dmy := 'XP';
              2:Dmy := 'XP (x64) / Server 2003 / Server 2003 R2';
            end;
          6:case TOSVersion.Minor of
              0:Dmy := 'Vista / Server 2008';
              1:Dmy := '7 / Server 2008 R2';
              2:Dmy := '8';
            end;
        else
          Dmy := 'Unknown';
        end;
      end;
    pfMacOS:
      begin
        Dmy := 'OSX';
      end;
  end;
  case TOSVersion.Architecture of
    arIntelX86:
      Dmy := Dmy + '(32bit)';
    arIntelX64:
      Dmy := Dmy + '(64bit)';
  end;
  ShowMessage(Dmy);
end;


[Operating System Version (Microsoft)]
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724832%28v=vs.85%29.aspx

[System.SysUtils.TOSVersion]
http://docwiki.embarcadero.com/Libraries/ja/System.SysUtils.TOSVersion

編集 削除
おう  2012-10-17 21:54:37  No: 43198  IP: 192.*.*.*

お返事ありがとうございます。

Windows7かVistaかXPかを調べる方法は、
GetVersionEx function 
で調べればいいんですね。

Windows XPならば、64-Bitかどうか、GetVersionEx function
でわかるんですね。

Windows7も同じようにわかればいいのに、と思ってしまいました。

64-Bitかどうか判定する方法、もう少し調べてみます。

編集 削除
おう  2013-01-16 00:05:37  No: 43199  IP: 192.*.*.*

お返事が遅くなって、すみません。

質問が途中から、32ビットか64ビットかを判定するには?に変わってしまってましたが、はじめの質問の、Windows7でプロダクトIDを取得するには?
は解決できたので、解決のチェックをします。

とりあえず、まず64ビットの場合の手順でプロダクトIDの取得を試み、だめな場合は32ビットの手順でプロダクトIDの取得を行う、という方法にしようと思います。

ありがとうございました。

編集 削除