ActiveX 无法加载库,即使它位于同一位置也是如此

本文关键字:位置 于同一 加载 ActiveX | 更新日期: 2023-09-27 18:35:32

我正在维护一个用MFC开发的ActiveX控件,用作多个商业应用程序的插件。 这一切都很完美,直到我希望包含 AES 加密,因为控件需要自动登录到远程位置。 没什么大不了的,创建了一个 C# 类库 (SimpleAES.dll),它只提供一个具有 2 个成员的类,加密和解密。 混合托管和非托管代码,我在 C++/CLR 中编写了一个包装库来包装我的加密类(SimpleAESWrapper.dll)。

当使用我的 ocx 测试容器应用程序进行测试时,这一切都像一个魅力,将所有 3 个库与测试容器应用程序(即测试.exe与 ocx 一起以及两个 dll 一起存储在同一个目录中。

不幸的是,当我运行加载 ocx 的第三方应用程序时,ocx 不会被加载,因为一旦我创建加密类的实例,它就会崩溃,因为它找不到 WrapperSimpleAES.dll。第三方应用程序从另一个位置运行。 将库位置添加到路径甚至 system32 文件夹并不能解决问题。

我是否错过了一些关键的东西,比如库是否必须以某种方式注册,就像 ocx 必须使用 regsvr32.exe 一样?即应用程序知道在哪里可以找到 ocx,因为它已注册到注册表中,对吗?

我一直在拔头发,因为我找不到有用的线索。

ActiveX 无法加载库,即使它位于同一位置也是如此

尝试将 WrapperSimpleAES.dll 存储在第三方程序目录中。

问题是您的 ActiveX 控件是由 LoadLibrary 调用找到的。COM 通过注册表项解析所需的 DLL。您现在的问题是,当您的代码执行时,找不到所需的下一个 DLL。

解决方法:

  1. 将辅助 DLL 设置为延迟加载。因此,加载 ActiveX 控件时不需要它。
  2. 当 ActiveX 需要辅助 DLL 时,请使用 GetDllDirectory 获取当前设置并保存它。
  3. 现在使用 SetDllDirectory 到主 ActiveX 的路径。
  4. 执行您的代码。延迟加载将成功。
  5. 调用后,使用 SetDllDirectory 还原旧设置。