RegEnumValue 使应用程序崩溃

RegEnumValue crashes application

本文关键字:崩溃 应用程序 RegEnumValue      更新时间:2023-10-16

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

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

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

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

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

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

来自 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 个字符。

卡布姆。