2012-03-09 91 views
0

在我们团队正在开发的其中一个项目中,我们正在尝试为现有的桌面应用程序制作自动部署系统。为了做到这一点,我们需要了解如何安装应用程序以开始使用InstallShield如何在不使用InstallShield的情况下从OCX中提取Com信息?

我们可以访问InstallShield清单,但有一个OCX文件,我们无法弄清楚如何手动安装(没有InstallShield)。这个特定的OCX文件设置为'提取COM信息'。

以下是截图:

InstallShield Properties Dialog

该应用中的其他OCX控件是自注册,这样他们就可以与Regsvr32.exe注册。但是我们遇到问题的OCX无法以这种方式注册。

如何手动安装在InstallShield清单中设置为“提取COM信息”的OCX文件?

回答

4

RegSvr32.exe调用LoadLibrary API来加载您的DLL,然后调用DLL中的DllRegisterServer入口点。该函数内的代码执行实际的COM注册。如果RegSvr32失败,那通常意味着DLL的依赖关系丢失或无效。

InstallShield将所有这一切与一些真正的低级别的黑客攻击一起虚拟化,然后收获它。关于这个问题的一篇旧文是:

Spying on Registry Entries

InstallShield不会真正使用每说这种技术(他们有多种技术,其中大部分未记录和各种过滤器和转换引擎来清理数据)。如果您只是在不使用InstallShield的情况下寻找方法,请查看Windows Installer XML的“Heat”命令行工具。这可以将COM元数据“收获”到WxS XML元素中。

此外,WiX是开源的,所以如果你真的好奇,你可以看看他们的代码。

+0

对不起,我们不能修改DLL,所以我们必须找到另一种方式。 – 2012-03-09 19:22:04

+0

我不相信我说过修改任何DLL的东西。 – 2012-03-09 19:27:44

+0

+1感谢您的回复,让我澄清。我不确定“RegSvr32.exe调用LoadLibrary来加载你的DLL,然后DLL里面的DllRegisterServer()。”手段。你是说在部署系统中运行DllRegisterServer吗? (我们可以通过编程来完成)。重申,是否在部署应用程序的内部,必须调用DllReigsterServer()? – 2012-03-09 19:52:19

2

正如克里斯托弗提到的,InstallShield通过在与regsvr32.exe调用类似的方式调用它时查看它注册的内容来从.ocx中提取COM信息。其各种形式的重定向(用于捕获目的)具有在文件在构建环境中注册时解决几个潜在权限问题的附加好处。但是,如果我不错过你的问题的重点,那就是“为什么regsvr32.exe your.ocx在目标机器上工作?”

这在黑暗中有点刺,因为你没有包含足够的信息。虽然缺少依赖关系可能会导致此问题,但我猜测您只能在Windows Vista/Server 2008或更高版本上看到此故障。如果是这种情况,那么很可能您的应用程序试图写入受Windows Resource Protection(WRP)保护的注册表项,或者被每个用户的typelib注册问题绊住。

当性能较差的自注册例程遇到WRP时,它会尝试写入其缺少修改权限的注册表项,然后注册失败。我不确定在那之前它写的钥匙会发生什么,但是之后的所有钥匙绝对不会让它出现在机器上。您应该能够确认是否使用类似Process Monitor这样的工具。

如果是这种情况,你会怎么做?那么,你可以坚持像InstallShield(你说你想离开)的提取方法。您可以修复该文件,以免试图写入受保护的密钥(您称其无法修改)。或者你也许可以使用Application Compatibility Toolkit(ACT)来填补一些空白,但我不知道你通常可以在下游做些什么。一般来说,我会建议修复该文件,或者继续使用工作方法。

+0

+1感谢您的深思熟虑的评论,您认为我应该在问题中包含哪些额外信息? – 2012-03-10 19:44:45

+0

Michael在InstallShield中有实际工作的不公平优势,所以他知道内部和外部的代码。 :-) FWIW,对于你的问题,我不清楚的是,如果你想在非常低的层次上理解提取是如何工作的,那么你可以编写自己的程序,或者如果你只是想解决COM提取问题有一次,或者你只是不想依靠InstallShield继续完成工作。 – 2012-03-10 21:06:51

+0

如果你只是想解决这个DLL的COM提取问题,并且你不介意给我发邮件,我可以通过一些技巧来运行它,我必须尝试为你解决这个问题。 – 2012-03-10 21:07:59

相关问题