0

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

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

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

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

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

4

2 回答 2

0

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

于 2013-10-16T00:49:19.420 回答
0

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

作为一种解决方法:

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

高温高压

于 2013-10-16T08:18:40.013 回答