程序递归地导航给定文件夹,为文件夹创建注册表,但执行 RegSetValueEx 函数后注册表中没有任何反应,我应该更改什么?我的意思是该程序运行完美,但注册表中关于 RegSetValuesEx 函数没有任何变化,只是 RegCreateKeys 运行良好。
#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <stdio.h>
#include <strsafe.h>
#include <iostream>
using namespace std;
#define DEFAULT_KEY_DIR "HKEY_CURRENT_USER"
#define DEFAULT_KEY_SUBDIR "Software\\CSSO"
#define DEFAULT_DIRECTORY "D:\\Example"
char xPath[2048] = "Software\\CSSO";
bool ListDirectoryContents(const char *sDir)
{
WIN32_FIND_DATA fdFile;
HANDLE hFind = NULL;
LARGE_INTEGER filesize;
DWORD return_value;
char sPath[2048];
HKEY hKey;
sprintf(sPath, "%s\\*", sDir);
if ((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
{
printf("Path not found: [%s]\n", sDir);
return false;
}
do
{
if (strcmp(fdFile.cFileName, ".") != 0
&& strcmp(fdFile.cFileName, "..") != 0)
{
sprintf(sPath, "%s\\%s", sDir, fdFile.cFileName);
if (fdFile.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
{
printf("%s\n", sPath);
memset(&xPath[0], 0, sizeof(xPath));
strcpy(xPath, DEFAULT_KEY_SUBDIR);
int j = strlen(DEFAULT_KEY_SUBDIR);
for (int i = strlen(DEFAULT_DIRECTORY); i < strlen(sPath); i++)
{
xPath[j] = sPath[i];
j++;
}
RegCreateKeyEx(
HKEY_CURRENT_USER,
xPath,
0, 0, REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS, 0, &hKey, 0
);
ListDirectoryContents(sPath); //Recursion, I love it!
}
else {
filesize.LowPart = fdFile.nFileSizeLow;
filesize.HighPart = fdFile.nFileSizeHigh;
_tprintf(TEXT("%s %ld bytes\n"),sPath, filesize.QuadPart);
return_value = RegSetValueEx(
hKey,
fdFile.cFileName, 0,
REG_DWORD,
(BYTE*)filesize.QuadPart,
strlen(sPath)
);
}
}
} while (FindNextFile(hFind, &fdFile));
FindClose(hFind);
return true;
}
int main()
{
ListDirectoryContents("D:\\Example");
system("PAUSE");
return 0;
}
最佳答案
上面的代码正在经历一个递归循环,它向注册表添加了大量垃圾。不建议这样做。
return_value = RegSetValueEx(
hKey,
fdFile.cFileName, 0,
REG_DWORD,
(BYTE*)filesize.QuadPart,
strlen(sPath))
(BYTE*)filesize.QuadPart
错误。类似于这样写:
BYTE* ptr = (BYTE*)123;
这将创建一个指向内存地址 123 的指针,我们不允许对其进行修改。您的意思是改为编写 (BYTE*)&filesize.QuadPart
。
假设您要写入文件大小,请使用 REG_QWORD
而不是 REG_DWORD
。使用 sizeof(filesize.QuadPart)
而不是 strlen(path)
。
if (ERROR_SUCCESS != RegSetValueEx(hKey, fdFile.cFileName, 0, REG_QWORD,
(BYTE*)&filesize.QuadPart, sizeof(filesize.QuadPart))
{
printf("RegSetValueEx error\n");
}
但是,您应该仅使用注册表来添加初始化数据。如果您有大量数据,则保存到文件,或者只是将其保存在内存中。
关于C、Windows API递归导航子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46760012/