【问题标题】:Invalid HANDLE was specified when RegCloseKey(HKEY)RegCloseKey(HKEY) 时指定了无效的 HANDLE
【发布时间】:2012-05-01 18:29:11
【问题描述】:

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

【问题讨论】:

  • 附带说明,如果有人能告诉我如何缩进上面的代码,我将不胜感激——这让我发疯了!大声笑

标签: visual-c++ mfc visual-studio-2003 registrykey


【解决方案1】:

嗯,答案是非常、非常、非常简单的人......

我使用的是"\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);
}
}

这个小sn-p 的结果给你一个十进制的数字,供你检查winerror.h。如果您搜索号码,则 L - 例如“161L”你会发现错误是什么意思。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多