2017-08-26 115 views
0

我需要编写一个程序,使用一些COM对象,从python comtypes包中进行访问。我使用clsid和/或progid来创建和使用它们。这些对象由第三方提供,通常安装有普通安装程序(setup.exe或msi文件)。假设这些dll文件有一个许可证,允许我将它们与我的程序一起发货。是否有可能将这些DLL文件加载到内存中,并从便携式应用程序使用它们,而无需实际注册它们?或者,我可以从我的程序注册吗?如何将COM dll打包到便携式应用程序中?

一个相关的问题是:如何确定创建给定COM对象所需的dll文件链? (除了试验和错误)

背景:实际上,有多个库,主要问题是我不希望用户在启动实际程序之前运行4个不同的安装程序。这对普通用户来说太困难了。

回答

2

你在这里问很多问题。有很多方法可以完成你想要完成的任务,并且很难回答如此广泛的问题。如果您对如何执行特定的事情有特定的问题,请为这些人开启新帖。

这就是说,我会尽力给你一些信息来帮助你弄清楚你需要做什么。

你可以在不注册它的情况下使用COM DLL吗?

是的。有几种方法,这取决于您使用的COM DLL和平台的需求。但是,有些选项并不总是有效,其他选项非常具有挑战性。

  • DllGetClassObject - 在某些情况下,这取决于你试图加载COM对象,你可以加载DLL,直接调用DllGetClassObject功能,并使用返回IClassFactory来创建对象。这是最简单的方法 - 如果有效的话。如果您创建的类需要DLL注册(可能它在内部执行CoCreateInstance,或者它可能需要代理支持),但这对您无效。要确定这是否可行,它可能是反复试验,或者你必须向COM DLL的开发者询问。
  • Registration-free COM - 这是如何在.NET中完成的。我不确定您是否可以在Python中轻松完成这样的任务。
  • CoRegisterClassObject - 如果您要创建自己的免注册COM实现,该功能将非常关键。我相信这是Microsoft免注册COM的基本实现细节。不过要注意的是,这将是一件非常有挑战性的事情,而且这将需要很好的理解COM。

你能从你的程序注册一个COM DLL吗?

是的。有几种方法。但是,您可能会遇到安全问题 - 通常,COM组件在HKEY_LOCAL_MACHINE中注册,并且您通常需要管理员权限才能在此处编写代码。某些COM组件/安装程序旨在在HKEY_CURRENT_USER中注册自己,这将解决安全问题。但是,您可能无法控制组件注册的位置,即使您注册了HKEY_CURRENT_USER也不是完美的解决方案。

  • regsvr32.exe - 一种选择是以编程方式在DLL上调用regsvr32.exe
  • DllRegisterServerDllInstall - 如果一个COM DLL可以注册到regsvr32.exe,那么它至少有一个这样的函数被导出。您可以手动加载DLL并调用这些函数,就像regsvr32.exe一样。 DllInstall不如DllRegisterServer。如果有DllInstall,它可能会让您选择安装在HKEY_CURRENT_USER。如果不是,你只需要做任何事情,因为没有你可以提供给该功能的选项。
  • 自己编写注册表值 - 如果能够找出所需的所有注册表设置,则不会阻止您将其手动放入注册表中。这将得到HKEY_LOCAL_MACHINE/HKEY_CURRENT_USER问题 - 您可以将它们写入任何地方(但HKEY_LOCAL_MACHINE仍可能需要管理员权限)。
  • regedit.exe - 另一种自己编写注册表值的方法是将它们存储在.reg文件中,并致电regedit.exe将它们合并。

如何确定DLL的依赖关系?

理想情况下,该DLL的开发人员知道并可以告诉你。这是真正的傻瓜证明的唯一方法。

  • 对于COM依赖关系,除了要求开发人员或反复试验之外,可能无法找出其他任何方式。这是因为COM依赖可能存在,只是因为DLL中的一些代码只是调用CoCreateInstance来创建一些第三方COM对象,并且由于这是仅在源代码中表达的内容,所以在DLL上没有任何元数据可以帮助你会发现这些依赖关系。
  • 以上对于任何动态加载的依赖关系也是如此。例如,如果某些代码直接调用LoadLibrary,则无法从外部确定依赖关系。
  • 对于静态加载的依赖关系,可以使用像Dependency Walker这样的工具。请注意,您将看到的很多依赖关系是系统依赖关系 - 您不希望包含user32.dll和kernel32.dll,因为它们随Windows一起安装。

如何安装第三方依赖项?

如果您确切地知道要写入什么文件,在哪里写入以及需要应用哪些注册表设置(等),您可以自己完成所有这些。对于某些依赖关系,只需在安装程序中包含第三方安装程序并将其静默执行即可。正因为如此,许多安装人员都支持静音模式。一个很好的例子就是Visual C++运行时(msvcrt * .dll) - 许多应用程序需要这种依赖性,许多安装程序只是将Microsoft的安装程序作为发行版的一部分,而主安装程序只是静静地调用辅助安装程序。