我制作了一个 ActiveX 控件,并制作了它的 .cab 文件,以便使用 Internet Explorer 在客户端机器上自动安装。它在 Windows XP 上运行良好,但在 Windows Vista 和 Windows 7 上,它的安装被 UAC(用户帐户控制)阻止,当我禁用它时,一切正常......我已经用开发环境证书签署了我的 .cab 文件......解决这个问题的方法是什么......我不想告诉用户禁用他们的 UAC 模块...
1 回答
这很可能是因为您试图在 HKEY_LOCAL_MACHINE 中注册您的控件,这是 ATL 中的默认设置。如果您将控件更改为在 HKEY_CURRENT_USER 中注册(启用 UAC 并且您未提升权限时唯一可访问的注册表部分),您应该没问题。
如果你使用 VS2008 和 ATL,你可以通过调用:
AtlSetPerUserRegistration(perUser);
在旧版本中,您需要更多的技巧。这是我们用来解决 FireBreath 问题的一个类,FireBreath 是我帮助维护的跨浏览器插件框架:
http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/axutil.cpp http://code.google.com/p/firebreath/source/browse/src/ActiveXPlugin/axutil.h
那么您只需输入:FbPerUserRegistration perUser(true);
在您的 DllRegisterServer 和 DllUnregisterServer 入口点中。
或者(我不使用 .cab 安装,所以我没有尝试过),但是 msdn 上有一个文档讨论了修改 .cab 安装以执行此操作的方法,不需要修改您的控件:
http://msdn.microsoft.com/en-us/library/dd433049%28VS.85%29.aspx
另一个快速说明,您可以使用 Process Monitor 查看您在注册控件时使用的键;摆弄过滤器需要一些练习,但是一旦掌握了它,它就不错了。如果您正在写信给 HKCR (HKEY_CLASSES_ROOT),默认情况下会将内容放在 HKEY_LOCAL_MACHINE/Software/Classes 中。您想要做的(避免没有管理员权限的问题)是将密钥放在 HKEY_CURRENT_USER/Software/Classes 中。
希望有帮助