C++构建器 - 如何使用Tregistry从HKEY_LOCAL_MACHINE中保存和还原密钥值?

问题描述 投票:0回答:1
使用C ++构建器11.1.5。这是针对Windows VCL 64位应用程序的。 我正在尝试将注册表(以及所有子键和值)的密钥写入备份文件,以便在以后进行恢复。 关键值在

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

registry c++builder vcl
1个回答
0
投票
泄漏开口

LoadRegistryKeyFromFile()

,现在说,
HANDLE
只是调用win32
OpenProcessToken()
函数,然后调用
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); }
    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.