1 注册控件
注册32位控件:RegDLL "c:\windows\system32\x.dll"
注册64位控件:
禁止文件重定向,使用系统命令注册控件,如下:
ExecWait ‘“$SYSDIR\regsvr32.exe" /s "c:\windows\system32\x_64.dll"'
可以参考:Library.nsh
2 修改注册表键权限
代码片段:
HKEY hKey = NULL;
// 区分32、64位注册表 ULONG rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\test\\test1",0,KEY_ALL_ACCESS|KEY_WOW64_32KEY|WRITE_DAC,&hKey);
//ACL (access control list)访问控制列表
PACL pOldDacl=NULL; PACL pNewDacl=NULL; DWORD dRet; EXPLICIT_ACCESS eia; //security安全 descriptor描述符 PSECURITY_DESCRIPTOR pSID=NULL; //DACL 自由访问控制列表 //ACL 管制对象访问两种类型的ACL 自由决定的DACL和系统SACL //DACL管制对象访问SACL管制审核 //SID 安全标示符security identifier //SAM是windows系统 的一个系统用户账号管理文件 security account manager // ObjectType 必须为 SE_REGISTRY_KEY,32 or 64位注册表由handle参数指定 dRet = GetSecurityInfo(hKey,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,&pOldDacl,NULL,&pSID);// 获取SAM主键的DACL if(dRet != ERROR_SUCCESS) { return 1; } //创建一个ACE,允许Users组成员完全控制对象,并允许子对象继承此权限 ZeroMemory(&eia,sizeof(EXPLICIT_ACCESS)); BuildExplicitAccessWithName(&eia,"Everyone",KEY_ALL_ACCESS,SET_ACCESS,SUB_CONTAINERS_AND_OBJECTS_INHERIT); // 将新的ACE加入DACL //ACL 访问控制列表 //DACL 自由访问控制列表 //SACL 系统访问控制列表 dRet = SetEntriesInAcl(1,&eia,pOldDacl,&pNewDacl); if(dRet != ERROR_SUCCESS) { return 2; } // 更新主键的DACL dRet = SetSecurityInfo(hKey,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL); if(dRet != ERROR_SUCCESS) { return 3; } SetSecurityInfo VS GetNamedSecurityInfo(32位程序不能修改64位注册表键的权限,只有SE_REGISTRY_WOW64_32KEY,而没有SE_REGISTRY_WOW64_64KEY)。
转自:http://blog.csdn.net/xiliang_pan/article/details/12647573
