2017-05-13 11 views
0

レジストリから文字列キーを読み込むためにいくつかのコードを試してみましたが、テストした後に書き留めたものが見つかりました。しかし、非常に混乱することは、このコードがHKEY_LOCAL_MACHINE/HARDWAREキーのために機能するが、ソフトウェアのためには動作しないということです。私は何を無視するのか分からない?レジストリキーエラーを読み込む

char rgValue [512]; 
char fnlRes [512]; 
DWORD size1; 
DWORD Type; 
HKEY hKey = 0; 
char buf[512] = {0}; 
DWORD dwType = 0; 
DWORD dwBufSize = sizeof(buf); 

if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) 
{ 
    dwType = REG_DWORD; 
    if(RegQueryValueEx(hKey, TEXT("test"), 0, &dwType, (LPBYTE)buf, &dwBufSize) == ERROR_SUCCESS) 
    { 
     cout << "key value is '" << buf << "'\n"; 
    } 
    else 
     cout << "can not query for key value\n"; 
    RegCloseKey(hKey); 
} 
else 
    cout << "Can not open key\n"; 
+0

コール 'GetLastError'と結果とのあなたの記事を更新。 –

+0

@RichardCritten GetLastErrorに慣れていませんが、コードに挿入して0の値を返しました。私のメインコードでは、regKeyを正常に起動した後、エラーとデバッガで「RegQueryValueEx」フェイスが「キー値を問い合わせることができません」という行に移動します。 –

+0

'RegQueryValueEx'のドキュメントを読んだだけで、 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911(v=vs.85).aspxリンクのサンプルも参照 –

答えて

0

レジストリからDWORD値を読み取るように見えるが、それは代わりにNULLで終わる文字列であるかのように、あなたは、コンソールに出力し、それをしようとしています。 DWORDを読み取るには、char[]からDWORDにごバッファ変数を変更し、RegQueryValueEx()にそのアドレスを渡すために&演算子を使用して、例えば:

HKEY hKey = 0; 
DWORD dwValue = 0; 
DWORD dwType = 0; 
DWORD dwBufSize = sizeof(dwValue); 
LONG lRes; 

lRes = RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\SCADE\\HMI"), 0, KEY_QUERY_VALUE, &hKey); 
if (lRes == ERROR_SUCCESS) 
{ 
    lRes = RegQueryValueEx(hKey, TEXT("test"), 0, &dwType, (LPBYTE)&dwValue, &dwBufSize); 
    if (lRes == ERROR_SUCCESS) 
    { 
     if (dwType == REG_DWORD) 
      cout << "key value is " << dwValue << endl; 
     else 
      cout << "key value is not a DWORD" << endl; 
    } 
    else 
     cout << "can not query for key value. Error: " << lRes << endl; 
    RegCloseKey(hKey); 
} 
else 
    cout << "Can not open key. Error: " << lRes << endl; 
+0

あなたのお答えいただきありがとうございます。いくつかのregキーのためにあなたのコードを試しますが、それらのどれもロードされていません。 lResはいくつかのキーで2を返し、いくつかのキーで234を返します。私は私のレジストリのアクセス許可をチェックし、問題はありません。私は管理者として私のプログラムを実行するが、それはまだ動作しません! –

+0

私はいくつかのルートからいくつかの鍵を開くことができますが、私は特別なルートで作成した私自身の鍵を読むことができないという点で、混乱しています! –

+0

エラー2は 'ERROR_FILE_NOT_FOUND'で、エラー234は' ERROR_MORE_DATA'です。両方とも['RegQueryValueEx'](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724911.aspx)のドキュメントで説明されています:" * lpValueName'がレジストリで関数は 'ERROR_FILE_NOT_FOUND'を返します。' lpData'パラメータで指定されたバッファがデータを保持するのに十分な大きさでない場合、関数は 'ERROR_MORE_DATA'を返し、必要なバッファサイズを' lpcbData ''この場合、 '' lpData''バッファの内容は未定義です。* " –

関連する問題