2012-05-01 3 views
1

Im using Visual Studio 2003. Данная программа является приложением MFC.Недопустимая HANDLE была указана, когда RegCloseKey (HKEY)

Моя программа предназначена для открытия, чтения и закрытия ключей реестра. Я предполагаю, что открываю и читаю ключевой тон (потому что нет никаких инвалидов, ящиков сообщений или каких-либо других методов поиска ошибок, которые я реализовал).

Однако, когда я отлаживаю свою программу, я получаю «... Неверная 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 это символ [2], а только номер порта)

Как я уже сказал, я не становлюсь error/msg box with open, но я с закрытием ... Если кто-нибудь может указать, где я поступил неправильно, я был бы очень благодарен! :)

UPDATE: На основании ответа Лускана в поле ниже, я изменил мой код, и, таким образом, стал ближе к этому вопросу. Код structer теперь выглядит следующим образом:

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

на боковой ноте, если кто-то может сказать мне, как отступом вышеприведенный код, я был бы очень благодарен - это заводит меня с ума! лол – redhotspike

ответ

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» вы найдете, что означает ошибка.

Смежные вопросы