如何解决我不能使用RegOpenKeyEx
| 我在阅读注册表时遇到问题。 此函数查找注册表路径中的条目数。它运行完美,我已经测试过:void findNumberEntries(registryTest &INSTALLKEY) {
char buffer[50];
char size = sizeof(buffer);
int index = 0;
if(RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)(INSTALLKEY.regpath.c_str()),KEY_ALL_ACCESS,&INSTALLKEY.hKey) == ERROR_SUCCESS) {
DWORD readEntry;
do {
readEntry = RegEnumValue(INSTALLKEY.hKey,index,(LPTSTR)buffer,(LPDWORD)&size,NULL,NULL);
index++;
}
while(readEntry != ERROR_NO_MORE_ITEMS);
}
INSTALLKEY.number = index;
RegCloseKey(INSTALLKEY.hKey);
}
现在,主要功能:
std::string regpath32 = \"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Run\\\\\";
struct registryTest {
HKEY hKey;
std::string regpath;
int number;
};
registryTest INSTALLKEY = {HKEY_LOCAL_MACHINE,regpath32};
findNumberEntries(INSTALLKEY);
printf(\"%d\\n\",INSTALLKEY.number);
system(\"PAUSE\");
//until here everything works as it should
HKEY hKey = INSTALLKEY.hKey;
std::string regpath = INSTALLKEY.regpath;
char buffer[50];
char size = sizeof(buffer);
std::string bufferString;
DWORD regOpen = RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)INSTALLKEY.regpath.c_str(),KEY_READ,&INSTALLKEY.hKey);
if(regOpen == ERROR_SUCCESS) //this is the part that fails.
{
printf(\"Registry Key was successfully opened\\n\");
}
else
{
printf(\"Unable to open registry key\\n\");
LPVOID message;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,GetLastError(),(LPTSTR) &message,NULL );
MessageBox(NULL,(LPCTSTR)message,\"ERROR\",MB_OK|MB_ICONINFORMATION);
}
...rest of the code
我总是得到“无法打开注册表”,并且得到的错误消息是“没有更多文件”。问题是什么??
解决方法
您的问题是,当您第一次打开注册表项时,您将其分配给结构的hkey-member。因此,第二次此HKEY不再包含原始的基键。
变化:
DWORD regOpen =
RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)INSTALLKEY.regpath.c_str(),0,KEY_READ,&INSTALLKEY.hKey);
进入
DWORD regOpen = RegOpenKeyEx(
HKEY_LOCAL_MACHINE
,(LPTSTR)INSTALLKEY.regpath.c_str(),0,KEY_READ,&INSTALLKEY.hKey);
或更改此:
void findNumberEntries( registryTest &INSTALLKEY)
{
char buffer[50];
char size = sizeof(buffer);
int index = 0;
HKEY hkOpen = 0; // can\'t use INVALID_HANDLE_VALUE for HKEY\'s;
if (RegOpenKeyEx( INSTALLKEY.hKey,(LPTSTR)(INSTALLKEY.regpath.c_str()),&hkOpen ) == ERROR_SUCCESS)
{
// You should use RegQueryInfoKey for below code !
DWORD readEntry;
do {
readEntry = RegEnumValue( hkOpen,index,(LPTSTR)buffer,(LPDWORD size,NULL,NULL);
index++;
}
while(readEntry != ERROR_NO_MORE_ITEMS); }
INSTALLKEY.number = index;
RegCloseKey( hkOpen );
}
, 您可能还需要在第二个呼叫中指定KEY_ALL_ACCESS
,而不仅仅是在第一个呼叫中指定。在Win7 64位上,您可能会遇到注册表重定向疯狂(http://msdn.microsoft.com/zh-cn/library/aa384232%28VS.85%29.aspx)。
编辑:啊,您可能只是得到一个ERROR_CANTWRITE返回(错误代码5)。您可能可以忽略它并查看它是否仍然有效。
, 很可能在Windows 7 64位上通过注册表虚拟化将您重定向。您可以通过调用RegQueryReflectionKey来确定要重定向的键。
如果您修改代码以输出返回的实际整数值,而不是通用的“无法打开键”,那么它将很有帮助。例如,
long n = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT(\"\\\\SOFTWARE\"),KEY_QUERY_VALUE,&hk );
if ( n == ERROR_SUCCESS ) {
cout << \"OK\" << endl;
}
else {
cout << \"Failed with value \" << n << endl;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。