【问题标题】:Plugin DLLs that depend on other DLLs依赖于其他 DLL 的插件 DLL
【发布时间】:2011-01-13 10:59:45
【问题描述】:

我正在编写一个 DLL 以插入另一个(第 3 方)应用程序。 DLL 将需要依赖另一组 DLL(出于许可原因,我无法静态链接)。

我希望我的 DLL 可以“xcopy-deployable”到任何目录。我也不想要求将此目录添加到路径中。

如果我只是以通常的方式构建 DLL,Windows 将拒绝加载 DLL,因为它找不到当前进程旁边的 DLL。

有没有什么好的方法可以帮助 Windows 定位 DLL?


回答一些问题:

  • DLL 是用 C++ 编写的。
  • 额外的 DLL 是 QT-dll。
  • 我想将额外的 DLL 放在与我的插件 DLL 相同的文件夹中。我可以从GetModuleFileName 获取该文件夹的名称。
  • 应用程序是 Firefox,DLL 是 PKCS#11 安全模块。
  • 应用程序使用 DLL 的完整路径加载 DLL(用户在安装插件时提供)。
  • 要求将 DLL 放置在 System32 中或应用程序旁边会起作用,但它有点混乱,可能会导致卸载程序出现问题。
  • LoadLibraryGetProcAddress 当然可以,但在我的情况下并不可行。我在其他 DLL 中使用了数百甚至数千种方法。我真的需要使用导入库。

我曾考虑在 DllMain 中使用延迟加载的 dll 和 SetDllDirectory。有人试过这样的吗?

【问题讨论】:

  • 您使用的是什么技术? .net?
  • 你的前提毫无意义而且被打破了。
  • 您可以随时将 dll 放在 System32 文件夹中...
  • 8 年后我仍然有同样的问题。显然没有人解决它。
  • @BenL 这个答案似乎很有希望:stackoverflow.com/a/36871768/5542。如果我还在处理这个问题,我会试一试。

标签: c++ windows dll loadlibrary


【解决方案1】:

我可以想到 3 种方法。

  1. 将 dll 放在与您的应用程序相同的文件夹中(您不能这样做吗?)
  2. 使用运行时链接。 LoadLibrary()GetProcAddress()
  3. 使用清单http://msdn.microsoft.com/en-us/library/aa374182(VS.85).aspx

但是如果 dll 和 .exe 不在同一个文件夹中,你怎么知道它在哪里?忘记Windows不知道,怎么知道?

【讨论】:

  • 它不是“我的”应用程序,我不太喜欢安装到“其他”应用程序的文件夹中。清单解决方案听起来真的很有趣 - 我会研究一下。你有更多的参考资料吗?
【解决方案2】:

你可以指定dll的路径作为LoadLibrary()的参数。

【讨论】:

    【解决方案3】:

    另一个选项是修改 PATH 变量。有一个用于启动主应用程序的批处理文件,并设置 PATH=%PATH%;%~dp0。这确保了最小的占用空间,运行后不会在系统中留下额外的痕迹。

    【讨论】:

    • 这不是一个好主意。这会将罐子踢给用户。为什么用户在获得插件后会改变启动应用程序的习惯?
    • 因为它是满足所有 OP 约束的唯一答案。任何 x-copyable(不留下足迹)的答案都需要在代码运行之前设置路径,这意味着您必须在启动过程中注入更改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多