21

このコードを使用して、キーが存在するかどうかを確認します。

if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk') then
begin
  MsgBox('Key exists!!', mbInformation, MB_OK);
end;

この例では、機能します。メッセージボックスがありますが、これでは機能しません:

if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Autodesk\Maya') then
begin
  MsgBox('Key exists!!', mbInformation, MB_OK);
end;

しかし、Mayaキーは私のコンピューターに存在します。誰でも私を助けることができますか?

編集 :

実際、Inno Setup は正しいキーにアクセスしていないようです...
たとえば、このコードでは のすべてのサブキーを一覧表示しますHKEY_LOCAL_MACHINE\SOFTWAREが、(!) 結果はHKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node...のすべてのサブキーになります。

if RegGetSubkeyNames(HKEY_LOCAL_MACHINE, 'SOFTWARE', Names) then
begin
  S := '';
  for I := 0 to GetArrayLength(Names)-1 do
    S := S + Names[I] + #13#10;
  MsgBox('List of subkeys:'#13#10#13#10 + S, mbInformation, MB_OK);
end;

なぜこのWow6432Node鍵?

4

3 に答える 3

22

Inno Setup のせいではありません。レジストリはVista 以降で仮想化され、64 ビットではネイティブ 64 ビットと WOW 化された 32 ビットのブランチがあります。

この場合、Inno Setup は 32 ビット プログラムであるため、OS はすべてのHKLM\Softwareレジストリ要求をWOW6432Node.

インストーラーでレジストリの仮想化を処理するには、特に x86 および x64 キー ルートを使用できます。たとえば、区別する必要がある場合は、セクションでHKLM32orを使用します。セクションでは、ブロック内を使用してレジストリ ヘルパー関数呼び出しをラップします。HKLM64[Registry][Code]HKLM64if IsWin64

この例は、インストーラーが x64 インストーラーとして宣言されているかどうかに関係なく、インストーラーから正常に動作します。

function Mobu120x64IsAvailable(): Boolean;
var
  resultString: String;
begin
  resultString := 'No';
  if IsWin64 then
  begin
    Result := RegValueExists(HKLM64, 'SOFTWARE\Autodesk\MotionBuilder\2012', 'InstallPath');
    if Result then begin
      resultString := 'Yes';
    end;
    Log('Win64: Found Mobu 12.0 for x64?:' + resultString);
  end;
end;
于 2011-06-13T16:41:27.643 に答える
18

推測させてください... Windows 7 64ビットを使用していますか?

InnoSetup のせいではありません。Vista 以降ではレジストリが仮想化されており、64 ビットにはネイティブ 64 ビットと WOW された 32 ビットのブランチがあります。

この場合、InnoSetup は 32 ビット プログラムであるため、OS はすべての HKLM\Software Registry 要求を WOW6432Node に送信します。

プログラムが 64 ビットの場合は、64 ビットのセットアップ プログラムも使用する必要があります。

于 2010-10-27T15:09:32.543 に答える
1

Software\Autodesk\Mayaレジストリ キーでよろしいですか? たぶんそれは単なる値であり、使用する必要がありますRegValueExists

于 2010-10-27T14:01:01.160 に答える