1

我使用 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 的论点?还是我没有正确初始化某些东西?

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。如果您搜索数字然后 L - 例如“161L”,您将找到错误的含义。

于 2012-05-03T19:27:59.173 回答