我正在使用Visual Studio 2003.有问题的程序是一个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的论据?还是我没有正确地把事情搞砸了?
答案 0 :(得分: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。如果您搜索数字,那么L - 例如“161L”你会发现错误意味着什么。