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

解決


おう  2012-10-15 02:50:21  No: 43188

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

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-15 08:17:20  No: 43189

こんちには,

>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 09:37:31  No: 43190

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

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

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

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

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


Mr.XRAY  2012-10-15 09:43:35  No: 43191

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

 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 09:47:15  No: 43192

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


おう  2012-10-16 10:40:24  No: 43193

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

プロダクト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 10:44:24  No: 43194

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

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


おう  2012-10-17 06:50:43  No: 43195

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

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

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

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

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

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


おう  2012-10-17 06:50:44  No: 43196

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

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

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

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

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

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


DEKO  2012-10-17 16:46:26  No: 43197

> 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-18 06:54:37  No: 43198

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

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

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

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

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


おう  2013-01-16 09:05:37  No: 43199

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

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

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

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


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加