お世話になっております。
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の取得を行う、という方法にしようと思います。
ありがとうございました。