如何在C++ builder中将注册表导出为* .reg文件?
我使用reg-> SaveKey(“Software”,“D:\ 1.reg”)。但获取空文件,没有数据。如何在C++ builder中将注册表导出为* .reg文件?
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TRegistry *reg=new TRegistry(KEY_READ);
reg->RootKey=HKEY_LOCAL_MACHINE;
reg->OpenKey("Software",0);;
reg->SaveKey("Software","D:\\1.reg");
delete reg;
}
SaveKey
是围绕RegSaveKey()
一个松散的包装,文档,其中规定:
调用进程必须启用
SE_BACKUP_NAME
特权。有关更多信息,请参阅使用特权运行。
用户令牌通常不会启用SE_BACKUP_NAME
权限。为了满足此要求,您需要:
- 以管理员身份运行。
- 将
SE_BACKUP_NAME
权限添加到您的用户令牌。
您必须坚持的另一个要求是在您致电SaveKey
之前,输出文件不能存在。
查看此EDN article的C++代码说明该方法。
我将* reg设置为KEY_READ,但问题仍然存在。 – Viktorianec 2011-06-08 11:33:18
由于您在'SaveKey'中指定了密钥,因此不需要调用'OpenKey'。 'SaveKey'是Win32 API'RegSaveKey'的一个松散包装。尝试直接调用'RegSaveKey',然后查看它返回的错误代码,以查看它失败的原因。 – 2011-06-08 11:45:05
另一点。在之前的一个问题中,我已经告诉过你关于KEY_ALL_ACCESS的信息。请您仔细阅读您提供的建议,以免一再犯同样的错误。 – 2011-06-08 11:46:37
下一个变体工作!
void __fastcall TForm1::Button2Click(TObject *Sender)
{
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("Software","D:\\1.reg");
delete reg;
}
}
什么是reg?你使用什么库访问注册表? – CharlesB 2011-06-08 10:03:22
图书馆 - TRegistry。 TRegistry * reg =新TRegistry(KEY_ALL_ACCESS); – Viktorianec 2011-06-08 10:05:16
请提供更多代码。也可能是KEY_READ,因为它可能是一个许可问题 – CharlesB 2011-06-08 10:13:59