VisualStudio2003を使用しています。問題のプログラムはMFCアプリケーションです。
私のプログラムは、レジストリキーを開いて、そこから読み取り、次に閉じることを扱います。キーを開いて正常に読み取っていると思います(無効なメッセージボックス、または実装したその他のエラー検出メソッドが表示されないため)。
ただし、プログラムをデバッグすると、「...無効なHANDLEが指定されました...」(メモリアドレスを含む)が表示されます。デバッガーを使用してコードをステップ実行しようとしましたが、物事を追うことができずにとても楽しかったです。
エラーが発生するコードの部分は次のとおりです。
HKEY hKey;
char *subKey = "\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port ";
strcat(subKey, scsiPortNum);
LONG openResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &hKey);
if(openResult != ERROR_SUCCESS){
MessageBox(0, "There was an error closing the registry key", "Error", MB_OK);
}
//...do a few RegQueries...
LONG closeResult = RegCloseKey(hKey); //******Invalid HANDLE occurs here*******
if(closeResult != ERROR_SUCCESS){
MessageBox(0, "There was an error closing the registry key", "Error", MB_OK);
}
(scsiPortNumはchar [2]であり、単なるポート番号です)
私が言ったように、私は開いているエラー/メッセージボックスを取得していませんが、私は閉じています...誰かが私が間違っていた場所を指摘できるなら、私は大いに感謝します!:)
更新: 以下のluskanの回答に基づいて、コードを変更したため、問題に近づきました。コードストラクチャは次のようになります。
HKEY hKey;
try{
char subKey[MAX_PATH];
strcpy(subKey, "\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port ");
strcat(subKey, scsiPortNum);
auto openResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, subKey, 0, KEY_ALL_ACCESS, &hKey);
if(openResult == ERROR_SUCCESS){
//do query...
//close key
auto closeResult = RegCloseKey(hKey);
if(closeResult != ERROR_SUCCESS){
MessageBox(0, "Error closing the key", "Registry Error", MB_OK);
}
}else{
MessageBox(0, "Error opening the key", "Registry Error", MB_OK);
}
}catch(...){
MessageBox(0, "You caught an exception!", "Try/Catch", MB_OK);
}
そして、私は今キーを開くことについてのメッセージを受け取ります...多分私はRegOpenKeyExが取る議論を誤解していますか?または私は何かを正しく初期化していないのですか?