1

私のアプリケーションでは、最初に RegSetValueEx() を使用してキー値を設定すると機能しますが、同じ関数を使用して値を変更しようとすると機能せず、値は同じままです。私は何を間違っていますか?

コードは次のとおりです。

SetSZValue( "MyAppData", "versionInfo", "1.0.0" );


    HKEY CreateKey( string regkey )
    {
         HKEY hKey ;
         DWORD disValue ;

         char msg[512] ;

         string _key = "HKEY_LOCAL_MACHINE\\" ;
                _key += regkey ;

         LONG retValue = RegCreateKeyEx( HKEY_LOCAL_MACHINE, regkey.c_str(), 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, &hKey, &disValue ) ;
         if (retValue != ERROR_SUCCESS)
         {
             FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, &msg[0], 512, 0 ) ;
             MessageBox( 0, &msg[0], "CreateKey", MB_OK | MB_ICONEXCLAMATION );
         }

         return hKey ;
    }



    void SetSZValue( string regkey, string keyName, string keyValue )
    {
         HKEY hKey;
         DWORD disValue;

         char msg[512];

         hKey = CreateKey(regkey);
         if (hKey)
         {
            LONG retValue = RegSetValueEx( hKey, keyName.c_str(), 0, REG_SZ, ( const BYTE* )( keyValue.c_str() ), keyValue.size()+1 );
            if ( retValue != ERROR_SUCCESS )
            {
                FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(), 0, &msg[0], 512, 0 );
                  MessageBox( 0, &msg[0], "SetSZValue", MB_OK | MB_ICONEXCLAMATION );
            }

                RegCloseKey ( hKey );
         }
    }
4

2 に答える 2

1

アプリは 64 ビット Windows バージョンで実行される 32 ビット プロセスですか? その場合、アプリには「requestedExecutionLevel」値を含む UAC マニフェストがありますか? そうでない場合は、キーがレジストリの別のセクションに仮想化されている可能性があり、単に適切な場所を探していません。 レジストリの仮想化は WOW64 の機能であるため、従来の 32 ビット プロセスと 64 ビット プロセスがレジストリ内で互いにステップ オーバーすることはありません。SysInternals Process Monitorをインストールする必要があります。これにより、アプリが実際にアクセスしているキーと値が表示されます。

于 2012-12-07T22:58:30.760 に答える
1

RegSetValueEx変更するキー内の値の名前を受け入れます。キーの名前ではありません。代わりに値の名前を指定してください。キー名はそれ自体に由来しHKEYます。

于 2012-12-07T20:44:12.640 に答える