0

Windows7 と Win64 は新しいプラットフォームであり、プログラミングに関しては、何が起こったのかわかりません。次のコマンドを使用して Windows7 64 ビットの Windows レジストリにキーを保存します。問題は、同じコードが REG_OPENED_EXISTING_KEY の戻り値を返すことができることです。これは、キーの作成が成功し、関数が後続の呼び出しでキーを読み取ったり開いたりできることを意味しますが、regedit.exe の場所でキーを見つけようとすると、単に表示されません。 HKLM_LOCAL_MACHINE/Software/MyProject にも HKLM_LOCAL_MACHINE/Software/Wow6432Node/MyProject にもないツリー

ここで何が起こっているのか、誰でもクリアできますか?

 HKEY hKey ;
 HKEY  key = HKEY_LOCAL_MACHINE;
 DWORD disValue ;
 string subKey = "Software\\MyProject\\";

 LONG retValue = RegCreateKeyEx( key, subKey.c_str(), 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, &disValue ) ;
 if ( retValue == ERROR_SUCCESS )
 {
    if ( disValue == REG_CREATED_NEW_KEY )// new key created. This value will change to REG_OPENED_EXISTING_KEY if the key already existed, the function then simply open the key.
       return true;
    return false;
 }
4

2 に答える 2

1

If your process is not running as Administrator, it will be unable to access HKLM\SOFTWARE. For compatibility reasons, Windows Vista and Windows 7 will then apply something called "registry virtualization". This redirects accesses to HKLM\SOFTWARE to somewhere that your process can access. It does something similar for legacy processes that attempt to write to C:\Program Files.

How does Windows decide that your application is "legacy" and needs this compatibility hack? You need an application manifest to tell Windows that your process is Windows Vista-aware and that you don't want the hack.

于 2012-11-27T14:04:28.017 に答える
0

以下のマニフェスト ファイルをプロジェクトに追加し、resource.rc ファイルにCREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "MyProject.exe.Manifest"を追加しました。そして出来上がり。

**MyProject.exe.Manifest**

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly
  xmlns="urn:schemas-microsoft-com:asm.v1"
  manifestVersion="1.0">

<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> 
    <application> 
      <!--This Id value indicates the application supports Windows Vista functionality -->
    <supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/> 
      <!--This Id value indicates the application supports Windows 7 functionality-->
    <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
    </application> 
</compatibility>

<assemblyIdentity
    name="MyCompany.Apps.MyProject"
    processorArchitecture="*"
    version="1.0.0.0"
    type="win32"/>
<description>App description</description>
<dependency>
    <dependentAssembly>
    <assemblyIdentity
        type="win32"
        name="Microsoft.Windows.Common-Controls"
        version="6.0.0.0"
        processorArchitecture="*"
        publicKeyToken="6595b64144ccf1df"
        language="*"
    />
    </dependentAssembly>
</dependency>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
    <requestedPrivileges>
        <requestedExecutionLevel
        level="requireAdministrator"
        uiAccess="false"/>
    </requestedPrivileges>
</security>
</trustInfo>
</assembly>
于 2012-11-27T15:53:37.683 に答える