RegEnumValue崩溃了应用程序

时间:2012-05-08 21:20:20

标签: c++ winapi registry

我目前正在学习如何使用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;
}

2 个答案:

答案 0 :(得分:5)

您没有为值的名称提供任何空间。您正在将未初始化的指针valueName传递给RegEnumValue(),它拒绝(显然是通过崩溃您的应用)。请尝试以下方法:

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

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

您还需要使用strcmp()代替==来测试字符串值:

if (strcmp(valueName, subkey) == 0) ...

答案 1 :(得分: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
);

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

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

KABOOM。