代码之家  ›  专栏  ›  技术社区  ›  nagylzs

如何将COM DLL捆绑到便携式应用程序中?

  •  1
  • nagylzs  · 技术社区  · 8 年前

    假设这些DLL文件有一个许可证,允许我将它们与程序一起发布。是否可以将这些DLL文件加载到内存中,并在不进行实际注册的情况下从便携式应用程序中使用它们?或者,我可以从我的程序中注册它们吗?

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

    1 回复  |  直到 8 年前
        1
  •  3
  •   Michael Gunter    8 年前

    你在这里问了很多问题。有很多方法可以实现你想要实现的目标,很难回答这么多的问题。如果你对如何做一件特定的事情有具体的问题,请开始新的帖子。

    你能在不注册的情况下使用COM DLL吗?

    对根据COM DLL的需要和您使用的平台,有几种方法。然而,有些选项并不总是有效,其他选项非常具有挑战性。

    • DllGetClassObject 函数,并使用返回的 IClassFactory 创建对象。如果可行的话,这是最简单的方法。如果您创建的类需要注册DLL(可能需要 CoCreateInstance 在内部,或者可能需要代理支持),这将不适用于您。要确定这是否有效,要么是反复试验,要么你必须询问COM DLL的开发人员。
    • Registration-free COM -这是如何做到的。净额。我不确定您是否可以在Python中轻松完成类似的操作。
    • CoRegisterClassObject -如果您要创建自己的免注册COM实现,这个函数将是至关重要的。我相信这是微软免费注册COM的一个基本实现细节。然而,请注意,这将是一个 非常 对COM有很好的理解。

    HKEY_LOCAL_MACHINE ,您通常需要管理员权限才能在此处写入。一些COM组件/安装程序设计为在 HKEY_CURRENT_USER ,这将绕过安全问题。然而,您可能无法控制组件注册自身的位置,即使您这样做,也无法在中注册 HKEY_当前_用户 不是一个完美的解决方案。

    • regsvr32.exe -一种选择是以编程方式调用 在DLL上。
    • DllRegisterServer DllInstall regsvr32.exe ,则至少导出其中一个函数。您可以手动加载DLL并调用这些函数,就像 regsvr32.exe DllInstall公司 注册过程 . 如果 DllInstall公司 存在,您可以选择在中安装 HKEY_当前_用户 是的,因为没有可以为该函数提供的选项。
    • HKEY_LOCAL_机器 HKEY_当前_用户
    • regedit.exe .reg 文件和呼叫 合并它们。

    如何确定DLL的依赖关系?

    • 对于COM依赖项,除了询问开发人员或试错之外,可能无法找到其他方法。这是因为COM依赖可能存在,因为DLL中的某些代码只是调用 协同创建实例 创建一些第三方COM对象,由于这是只在源代码中表示的,所以DLL上没有元数据可以帮助您找到这些依赖项。
    • 对于任何动态加载的依赖项,上述情况也是如此。例如,如果一些代码只是调用 LoadLibrary 直接来说,您无法从外部确定依赖关系。
    • 对于静态加载的依赖项,可以使用以下工具: Dependency Walker . 请注意,您将看到的许多依赖项都是系统依赖项——例如,您不想包括user32。dll和内核32。dll,因为它们是随Windows安装的。

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