1

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が取る議論を誤解していますか?または私は何かを正しく初期化していないのですか?

4

1 に答える 1

0

答えは非常に、非常に、非常に単純な人々です...

使って"\HARDWARE\DEVICEMAP\Scsi\Scsi Port "いました。正しかった"HARDWARE\DEVICEMAP\Scsi\Scsi Port "のは...余分なものがありました\

RegOpenKeyExが返したエラーコードを見つけることでこれを理解しました。(下記参照)。


RegOpenEx、RegQueryValue、またはその他のReg関数からの戻り値をデバッグする場合は、次のコマンドを使用して、関数がどのエラーを返すかを確認できます(おそらくそれも改善できます!)。

char buffer[250]; //size of buffer is not that important
for(long a = 0; a < 1500; a++) {
if(result == a) {
_itoa((int)a, buffer, 10);
MessageBox(0, buffer, "Error from Reg Function", MB_ICONERROR | MB_OK);
}
}

この小さなスニペットの結果は、winerror.hと照合するための10進数の数値を示します。番号を検索すると、L-たとえば「161L」の場合、エラーの意味がわかります。

于 2012-05-03T19:27:59.173 に答える