1

我目前正在学习如何使用 c++ 处理注册表。我制作了一个应用程序,应该查看某个键中的某个值是否存在。但是,应用程序一到达 RegEnumValue() 就会崩溃。有什么想法可能是什么问题?

代码:

#include <iostream>
#include <windows.h>
#include <Psapi.h>

using namespace std;

bool registerKeyExists(char* key, char* subkey);

int main()
{
    while(true){
        if(registerKeyExists("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", "SynTPEnh")){
            return 0;
        }
    }

    return 0;
}

bool registerKeyExists(char* key, char* subkey){
    HKEY keyEnum;
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, key, 0, KEY_READ, &keyEnum) == ERROR_SUCCESS){
        char* valueName;
        DWORD valueSize = 100;
        DWORD cbName;
        FILETIME lastFiletime;
        DWORD i = 0;
        DWORD returnCode = ERROR_SUCCESS;
        while(returnCode == ERROR_SUCCESS){
            cout << "This show!" << endl;
            returnCode = RegEnumValue(keyEnum, i, valueName, &valueSize, NULL, NULL, NULL, NULL);
            cout << "This doesn't show!" << endl;
            if(valueName == subkey)
                return true;
            i++;
        }
    }
    return false;
}
4

2 回答 2

5

您没有为值的名称提供任何空格。您正在传递一个未初始化的指针valueNameRegEnumValue()它拒绝(显然是通过使您的应用程序崩溃)。请尝试以下操作:

char valueName[100];
DWORD valueSize = sizeof(valueName);

这将为返回的值名称保留 100 个字符。

您还需要使用strcmp()而不是==测试字符串值:

if (strcmp(valueName, subkey) == 0) ...
于 2012-05-08T21:21:51.190 回答
3

来自 RegEnumValue() 的 SDK 文档:

LONG WINAPI RegEnumValue(
  __in         HKEY hKey,
  __in         DWORD dwIndex,
  __out        LPTSTR lpValueName,         // <=== here
  __inout      LPDWORD lpcchValueName,
  __reserved   LPDWORD lpReserved,
  __out_opt    LPDWORD lpType,
  __out_opt    LPBYTE lpData,
  __inout_opt  LPDWORD lpcbData
);

请注意__outlpValueName 参数上的 SAL 注释。这意味着“将通过您提供的指针进行写入”。特别是,写下 SDK 文章其余部分中记录的值的名称。

问题是,您没有传递指向可写入内存的初始化指针。一个足以接收字符串的 TCHAR[] 数组,如下一个参数 lpcchValueName 所示。你让它未初始化。并谎称您为数组分配了 100 个字符。

卡布姆。

于 2012-05-08T21:32:10.000 回答