2011-06-08 102 views
1

我使用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; 

} 
+0

什么是reg?你使用什么库访问注册表? – CharlesB 2011-06-08 10:03:22

+0

图书馆 - TRegistry。 TRegistry * reg =新TRegistry(KEY_ALL_ACCESS); – Viktorianec 2011-06-08 10:05:16

+0

请提供更多代码。也可能是KEY_READ,因为它可能是一个许可问题 – CharlesB 2011-06-08 10:13:59

回答

3

SaveKey是围绕RegSaveKey()一个松散的包装,文档,其中规定:

调用进程必须启用SE_BACKUP_NAME特权。有关更多信息,请参阅使用特权运行。

用户令牌通常不会启用SE_BACKUP_NAME权限。为了满足此要求,您需要:

  1. 以管理员身份运行。
  2. SE_BACKUP_NAME权限添加到您的用户令牌。

您必须坚持的另一个要求是在您致电SaveKey之前,输出文件不能存在。

查看此EDN article的C++代码说明该方法。

+0

我将* reg设置为KEY_READ,但问题仍然存在。 – Viktorianec 2011-06-08 11:33:18

+2

由于您在'SaveKey'中指定了密钥,因此不需要调用'OpenKey'。 'SaveKey'是Win32 API'RegSaveKey'的一个松散包装。尝试直接调用'RegSaveKey',然后查看它返回的错误代码,以查看它失败的原因。 – 2011-06-08 11:45:05

+0

另一点。在之前的一个问题中,我已经告诉过你关于KEY_ALL_ACCESS的信息。请您仔细阅读您提供的建议,以免一再犯同样的错误。 – 2011-06-08 11:46:37

0

下一个变体工作!

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; 
} 



}