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