将 CreateComObject 与另一个目录中的 DLL 一起使用

Posted

技术标签:

【中文标题】将 CreateComObject 与另一个目录中的 DLL 一起使用【英文标题】:Use CreateComObject with DLL in another directory 【发布时间】:2021-03-22 01:38:16 【问题描述】:

我有一个 COM 可见的 C# 类。我已经使用 Import Component (Import Type Library) 向导将它导入到我的 Delphi XE 项目中。如果我将 C# .DLL 与我的 Delphi .EXE 放在同一目录中,我可以使用导入的 .PAS (TLB) 文件的 .Create 方法来创建此类的实例并使用其方法/函数。我想将此 .DLL 移动到另一个目录。如果它在另一个目录中,是否可以使用 Create 方法创建此类的实例?或者是否可以指示应用程序在另一个目录中查找新的 DLL?

我需要将 DLL 放在另一个目录中,因为我必须使用当前与 EXE 位于同一目录中的新版本 DLL,并且我无法覆盖可执行文件目录中的旧 DLL(它是一个遗留应用程序需要那些旧的 DLL)。因此,我打算将所有新的 DLL 放在一个子目录中并调用新函数。

我已尝试将其放在子目录中,但应用程序无法找到该 DLL。

【问题讨论】:

【参考方案1】:

CreateComObject 不要将文件名作为参数。它需要一个GUID,用于查找COM 对象所在的位置。该信息来自注册表,其中包含在注册 COM 对象时创建的条目。

CreateComObject 是 Windows API 函数 CoCreateInstance 的封装。

如果移动 DLL,则必须重新注册以反映新位置。

【讨论】:

或者,在您的客户端应用程序中使用免注册 COM 清单。但是是的,无论哪种方式,都必须提前告知 COM 在哪里可以找到 DLL,无论它恰好位于何处。

以上是关于将 CreateComObject 与另一个目录中的 DLL 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Django - 如何获取与另一个字段相关的upload_to目录

将文件与另一个提交中的另一个文件进行比较

如何将 Eureka 表单与另一个表放在 UIViewController 中?

将一个数组中的数字与另一个数组 Javascript 的索引进行比较

如何将char数组中的值与另一个char进行比较

将一个数组值与另一个多维数组匹配,然后从多维数组中获取值