我使用 Visual Studio 2003。有问题的程序是一个 MFC 应用程序。
我的程序处理打开、读取和关闭注册表项。我假设我正在打开并读取密钥(因为没有无效值、消息框或我已实现的任何其他错误查找方法出现)。
但是,当我调试我的程序时,我得到“...指定了无效的句柄...”(包括内存地址)。我尝试过使用调试器单步执行代码,但我很有趣,无法跟上进度。
发生错误的代码部分是:
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 的论点?还是我没有正确初始化某些东西?