お世話になっております。
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;
こんちには,
>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 版だったらゴメンなさい.って,私が謝る必要はないですよね.
元々情報が提供されていないのですから.
お返事ありがとうございます。
環境情報が抜けていましたが、64 bitです。
参考記事を参考にすると、
Registry := TRegistry.Create(任意のアクセス or KEY_WOW64_64KEY);
とあるので、
Reg:=TRegistry.Create;
の部分を、
Reg:=TRegistry.Create(任意のアクセス or KEY_WOW64_64KEY);
にしたらよいのでしょうか?
任意のアクセス って、何でしょうか?
>任意のアクセス って、何でしょうか?
 Reg:=TRegistry.Create;
 Reg.Access:=KEY_READ;  //任意のアクセス
 
    ↓
 Reg:=TRegistry.Create(KEY_READ or KEY_WOW64_64KEY);
// Reg.Access:=KEY_READ;  //任意のアクセス
ということですね.
教訓
問題が解決したら,この掲示板を参考にしている方のためにも,
是非,サマリーを書きましょう.
ちなみに,定数 KEY_WOW64_64KEY は Delphi 2007にもあります.
Windows.pas 内にあります.
お返事ありがとうございます。
プロダクト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を調べたらよいのかな、と思いますが、それでよろしいでしょうか?
>このプログラムが動くパソコンが、32ビットか64ビットかどうかを知る方法はあるでしょうか?
[Windowsのビット数を取得する方法を教えて下さい。(Delphi Q&A)]
https://www.petitmonte.com/bbs/answers?question_id=7779
お返事ありがとうございます。
レジストリの、このキーを見ればいい、ということではないようですね。
英語が苦手なので、教えていただいたサイトを調べるのに、もうちょっと時間がかかりそうです。
もうちょっと調べてみます。
Windows7かVistaかXPかを調べる方法も、CurrentVersionではないようでしたね。
この部分も、簡単ではないようなので、もうちょっと調べてみます。
お返事ありがとうございます。
レジストリの、このキーを見ればいい、ということではないようですね。
英語が苦手なので、教えていただいたサイトを調べるのに、もうちょっと時間がかかりそうです。
もうちょっと調べてみます。
Windows7かVistaかXPかを調べる方法も、CurrentVersionではないようでしたね。
この部分も、簡単ではないようなので、もうちょっと調べてみます。
> 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
お返事ありがとうございます。
Windows7かVistaかXPかを調べる方法は、
GetVersionEx function 
で調べればいいんですね。
Windows XPならば、64-Bitかどうか、GetVersionEx function
でわかるんですね。
Windows7も同じようにわかればいいのに、と思ってしまいました。
64-Bitかどうか判定する方法、もう少し調べてみます。
お返事が遅くなって、すみません。
質問が途中から、32ビットか64ビットかを判定するには?に変わってしまってましたが、はじめの質問の、Windows7でプロダクトIDを取得するには?
は解決できたので、解決のチェックをします。
とりあえず、まず64ビットの場合の手順でプロダクトIDの取得を試み、だめな場合は32ビットの手順でプロダクトIDの取得を行う、という方法にしようと思います。
ありがとうございました。
| ツイート |   |