如何恢复注册表项的所有元素?(上次写入时间,类型,值,名称...这是正确的方法吗?
How to recover all the elements of a registry key? (last write time, type, value, name …) Is this the right method?
我想恢复注册表项的所有元素。 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;
每当函数参数的文档显示">指向缓冲区的指针"之类的内容时,都需要提供已分配的缓冲区。
// 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);
缺少函数是否成功的检查。打开注册表项可能会由于多种原因而失败,例如权限不足:
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);
注册表项SOFTWAREMicrosoftWindowsCurrentVersionRun
的子项是值,因此必须改用RegEnumValueW()
。
确保在使用完注册表项后也调用RegCloseKey()
。
相关文章:
- 模板元程序查找相似的连续类型名称
- 将依赖名称显式标记为类型名和模板的奇怪之处
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 扩展C++生成的代码的模板参数类型名称
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 模板函数如何处理可能共享一个交集的多个类型名称?
- 即使直接从官方示例中复制,也找不到未知类型名称QML_ELEMENT和 QML 模块
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 类型名称 T::类型::值中的预期非限定 id
- 使用相同名称类型的两个不同库
- C Dijkstra算法 - 打印边缘名称/类型
- 如何避免使用类型名称类型
- 确保类型名称类型是“派生的基”
- 错误:'abc'没有名称类型 QT c++ GUI 应用程序
- 具有依赖名称(类型名称)的部分专用化
- 如何知道模板<类型名称类型>是什么类型?
- 好友类boost mongo_iarchive没有名称类型
- 语法类型函数中的名称(类型)