gpt4 book ai didi

C、Windows API递归导航子目录

转载 作者:行者123 更新时间:2023-11-30 16:40:13 25 4
gpt4 key购买 nike

程序递归地导航给定文件夹,为文件夹创建注册表,但执行 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com