HKEY_LOCAL_MACHINE\Software
到目前为止,我已经成功地使用了
TRegistry::SaveKey()
方法创建了备份,并且只要我称SetPrivilege()
并指定
SE_BACKUP_NAME
.。 我是我使用的例程,用于将注册表密钥保存到备份文件:
void SaveRegistryKeyToFile(const UnicodeString& key, const UnicodeString& fileName)
{
TRegistry *reg=new TRegistry(KEY_READ);
HANDLE ProcessToken;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &ProcessToken)) {
SetPrivilege(ProcessToken, SE_BACKUP_NAME, TRUE);
TRegistry *reg=new TRegistry(KEY_READ);
reg->RootKey=HKEY_LOCAL_MACHINE;
reg->SaveKey(key,fileName);
delete reg;
}
}
现在,我试图使用TRegistry::LoadKey()
SE_BACKUP_NAME
的特权,然后尝试加载密钥,但它不起作用。 每次我打电话LoadKey()
时,它都会返回false(无法正常工作)。 我用来执行此操作的代码是:
void LoadRegistryKeyFromFile(const UnicodeString& key, const UnicodeString& fileName)
{
TRegistry *reg;
HANDLE ProcessToken;
bool Result;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &ProcessToken)) {
SetPrivilege(ProcessToken, SE_BACKUP_NAME, TRUE);
reg = new TRegistry(KEY_WRITE)
reg->RootKey=HKEY_LOCAL_MACHINE;
if(FileExists(fileName)) {
Result = reg->LoadKey(key,fileName);
}
delete reg;
}
}
如果有人可以帮助我指向恢复过程的正确方向,那将不胜感激。您的功能都在泄漏内存。
SaveRegistryKeyToFile()
TRegistry
泄漏HANDLE
LoadRegistryKeyFromFile()
HANDLE
只是调用win32OpenProcessToken()
函数,然后调用TRegistry::SaveKey()
。 根据文档:
如果函数失败,则返回值是WinError.h中定义的非零错误代码。您可以将formatMessage函数与format_message_from_system标志一起获取错误描述。
您可以从
RegSaveKey()
属性中获取该错误代码,以及从TRegistry::LoadKey()
属性的格式化消息,例如:RegLoadKey()
RegLoadKey
注意,TRegistry::LastError
文档还说:
通话过程必须在注册表所居住的计算机上具有SE_RESTORE_NAME和SE_BACKUP_NAME特权
。有关更多信息,请参阅with with with with Special offiment。要在不需要这些特殊特权的情况下加载蜂巢,请使用regregLoadAppkey函数。 加载钥匙时,您没有启用
TRegistry::LastErrorMsg
特权,因此请尝试添加,例如:
if (!reg->SaveKey(key, fileName)) {
ShowMessage(_D("ERROR SAVING KEY!\n(") + String(reg->LastError) + _D(") ") + reg->LastErrorMsg);
}