Visual c++ RegCloseKey(HKEY)时指定的句柄无效

Visual c++ RegCloseKey(HKEY)时指定的句柄无效,visual-c++,mfc,visual-studio-2003,registrykey,Visual C++,Mfc,Visual Studio 2003,Registrykey,我正在使用VisualStudio2003。该程序是一个MFC应用程序 我的程序负责打开、读取和关闭注册表项。我假设我正在打开并读取密钥(因为没有显示无效ID、消息框或我实现的任何其他错误查找方法) 然而,当我调试我的程序时,我得到“…指定了无效句柄…”(包括内存地址)。我曾尝试使用调试器单步执行代码,但我一直很有趣,无法理解 发生错误的代码部分是: HKEY hKey; char *subKey = "\\HARDWARE\\DEVICEMAP\\Scsi\\Scsi Port "; strc

我正在使用VisualStudio2003。该程序是一个MFC应用程序

我的程序负责打开、读取和关闭注册表项。我假设我正在打开并读取密钥(因为没有显示无效ID、消息框或我实现的任何其他错误查找方法)

然而,当我调试我的程序时,我得到“…指定了无效句柄…”(包括内存地址)。我曾尝试使用调试器单步执行代码,但我一直很有趣,无法理解

发生错误的代码部分是:

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

答案非常非常简单

我使用的是
“\HARDWARE\DEVICEMAP\Scsi\Scsi端口”
。最后正确的是“硬件\DEVICEMAP\Scsi\Scsi端口”…我有一个额外的
\

我通过查找RegOpenKeyEx返回的错误代码找到了答案。(见下文)


对于调试从RegOpenEx、RegQueryValue或任何其他Reg函数返回的任何人,您可以使用以下命令查看函数返回的错误(您可能也可以对其进行改进!):

char缓冲区[250]//缓冲区的大小并不那么重要
用于(长a=0;a<1500;a++){
如果(结果==a){
_itoa((int)a,缓冲器,10);
消息框(0,缓冲区,“来自注册表函数的错误”,MB|U ICONERROR | MB|U OK);
}
}

这个小片段的结果将为您提供一个十进制数字,供您对照winerror.h进行检查。如果您搜索数字,则L-例如“161L”,您将找到错误的含义。

在旁注中,如果有人能告诉我如何缩进上述代码,我将非常感激,这让我发疯!英雄联盟
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);
}
}