C++ 我能';不要使用RegOpenKeyEx

C++ 我能';不要使用RegOpenKeyEx,c++,registry,C++,Registry,我在阅读注册表时遇到问题。 此函数用于查找注册表路径中的条目数。它工作完美,我已经测试过了: void findNumberEntries(registryTest &INSTALLKEY) { char buffer[50]; char size = sizeof(buffer); int index = 0; if(RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)(INSTALLKEY.regpath.c_str()),0,KEY_ALL_ACCESS,

我在阅读注册表时遇到问题。 此函数用于查找注册表路径中的条目数。它工作完美,我已经测试过了:

void findNumberEntries(registryTest &INSTALLKEY) {

char buffer[50];
char size = sizeof(buffer);
int index = 0;

if(RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)(INSTALLKEY.regpath.c_str()),0,KEY_ALL_ACCESS,&INSTALLKEY.hKey) == ERROR_SUCCESS) {     

    DWORD readEntry;

    do {
        readEntry = RegEnumValue(INSTALLKEY.hKey,index,(LPTSTR)buffer,(LPDWORD)&size,NULL,NULL,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(),0,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,
        NULL, GetLastError(), NULL,(LPTSTR) &message, 0, NULL );
    MessageBox(NULL,(LPCTSTR)message,"ERROR",MB_OK|MB_ICONINFORMATION);
}

...rest of the code

我总是收到“无法打开注册表”的错误消息,我得到的是“没有更多的文件”。问题是什么?

您可能还需要在第二次调用中指定
KEY\u ALL\u ACCESS
,而不仅仅是在第一次调用中。在Win7 64位上,您可能会遇到注册表重定向问题(http://msdn.microsoft.com/en-us/library/aa384232%28VS.85%29.aspx)


编辑:啊,你可能只是得到了一个回写错误(错误代码5)。您可以忽略它,看看它是否仍然有效。

在Windows 7 64位上,您很有可能通过它被重定向。您可以通过调用来确定正在重定向的密钥

如果您修改代码以输出返回的实际整数值,而不是通用的“无法打开键”,那么这将非常有用。比如说,

    long n = RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("\\SOFTWARE"),
                      0,KEY_QUERY_VALUE, &hk );
    if ( n == ERROR_SUCCESS ) {
        cout << "OK" << endl;
    }
    else {
        cout << "Failed with value " << n << endl;
    }
long n=RegOpenKeyEx(HKEY_本地_机器,文本(“\\SOFTWARE”),
0,键\查询\值,&hk);
如果(n==错误\成功){

cout您的问题是,当您第一次打开注册表项时,您将其分配给结构的hkey成员。因此,第二次此hkey不再包含原始的basekey

更改:

德沃德·雷戈普= RegOpenKeyEx(INSTALLKEY.hKey,(LPTSTR)INSTALLKEY.regpath.c_str(),0,KEY_READ,&INSTALLKEY.hKey)

进入

DWORD regOpen=RegOpenKeyEx( HKEY_本地_机器 ,(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())
                   ,0,&hkOpen ) == ERROR_SUCCESS) 
  {
      // You should use RegQueryInfoKey for below code !
      DWORD readEntry;      
      do {
         readEntry = RegEnumValue( hkOpen ,index,(LPTSTR)buffer
                       ,(LPDWORD size,NULL,NULL,NULL,NULL);
         index++;
     }
    while(readEntry != ERROR_NO_MORE_ITEMS); }
    INSTALLKEY.number = index;
    RegCloseKey( hkOpen );
 }

windows的哪个版本?32位还是64位?进程是32位还是64位?它是32位,但在WinXP 32位上,我得到“注册表项已成功打开”。在Win7 64位上,我得到这个问题。但是,我的findNumberEntries()函数甚至可以在Win7 64位上工作…这是奇数..在RegOpenKeyEx调用后立即将GetLastError值存储在某个变量中,将其值与FormatMessage结果一起打印。可能是“没有更多文件”消息有误导性。我猜对
findNumberEntries
中的
RegOpenKeyEx
调用失败是对的,因为UAC已打开,并且您正在请求
KEY\u ALL\u访问
。我100%确定该密钥已重定向,无需使用RegQueryReflectionKey进行查找!@David:检查不会有什么坏处:)Edwin此工作性能的确,非常感谢。但是hKey并不总是本地的_机器,可能是当前的_用户,我事先不知道。这就是为什么我试图在我的结构中跟踪它。我能做什么?另外,我也不清楚到底是什么问题。问题是你已经覆盖了hKey成员(最初包含hKey_本地_机器)使用新打开的键的值。相反,您可以在findNumberEntries(…)中使用本地HKEY变量。@jack:要获取有关HKEY的信息,可以调用regQueryInfo(…)这会告诉您有关该键的所有必需信息。无效的句柄值是句柄,我的编译器不允许我将其分配给HKEY…我能做什么?@jack:我错了,只需使用0即可。