gpt4 book ai didi

c++ - 如何恢复注册表项的所有元素? (上次写入时间、类型、值、名称……)这是正确的方法吗?

转载 作者:行者123 更新时间:2023-11-28 04:19:06 24 4
gpt4 key购买 nike

我想恢复注册表项的所有元素。 Windows API RegOpenEX 和 RegEnumKeyEx 的方法。但我不确定这是正确的方法。这是我的代码示例,那么是否应该使用这两种方法来检索此信息?

HKEY RegHkey;
Long RC=0;
DWORD a=0;
DWORD TMP=255;
FILETIME filetime;
LPWSTR lpName=nullptr;
LPWSTR lpClass=nullptr;
DWORD cchClasss=0;

RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",0,KEY_READ,&RegHkey);

while(RC != ERROR_NO_MORE_ITEMS)
{
RC=RegEnumKeyEx(RegHkey, a, lpName, &TMP, nullptr, lpClass, &cchClass, &filetime);
if(RC==ERROR_SUCCESS)
{
std::cout<<"type= "<<cchClass<<std::endl;
//etc...

}
a++;
}

如果 RC==ERROR_SUCCESS 我想检索类型、值和 last_write_time...。这是正确的方法吗?

最佳答案

不幸的是,这段代码中几乎所有的地方都是错误的。

LPWSTR lpName=nullptr;
LPWSTR lpClass=nullptr;

每当函数参数的文档说“指向缓冲区的指针”时,您需要提供一个缓冲区,该缓冲区是分配的。 p>

// The {} brackets zero-initialize the buffers.
wchar_t szName[255]{};
wchar_t szClass[255]{};
DWORD TMP=255;
DWORD cchClasss=0;

cchClass 设置为零是错误的。您必须告诉该函数,您的缓冲区实际有多大(它可以存储多少个字符,包括 '\0' )。变量TMP没有有意义的名字,cchName会更一致:

// No need to hardcode the array size.
DWORD cchName = ARRAYSIZE(szName);
DWORD cchClass = ARRAYSIZE(szClass);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",0,KEY_READ,&RegHkey);

缺少函数是否成功的检查。由于多种原因,打开注册表项可能会失败,例如。 G。没有足够的权限:

DWORD res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\",0,KEY_READ,&RegHkey);
if(res == ERROR_SUCCESS)
{
// do something with the registry key
}
while(RC != ERROR_NO_MORE_ITEMS)

RegEnumKeyEx 由于完成枚举以外的其他原因而失败时,您将陷入无限循环。正确的条件是 RC == ERROR_SUCCESS

  RC=RegEnumKeyEx(RegHkey, a, lpName, &TMP, nullptr, lpClass, &cchClass, &filetime);

注册表项 SOFTWARE\Microsoft\Windows\CurrentVersion\Run\ 的子项是值,因此您必须改用 RegEnumValueW()

确保在完成注册表项后调用 RegCloseKey()

关于c++ - 如何恢复注册表项的所有元素? (上次写入时间、类型、值、名称……)这是正确的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55870372/

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