7

我是 C++ 的“隐藏/黑暗的地方”的新手,我想知道如何从不同目录或当前可执行文件运行的子目录中加载 .dll 文件

前任:

./MyAppDirectory
  /MyApp.exe
  /SomeDLL.dll
  /AnotherDLL.dll
  /SubDirectory
    /SomeDLL2.dll
    /AnotherDLL2.dll
    /YetAnotherDLL.dll
    /...

所以“MyApp.exe”会自动从它的根文件夹“MyAppDirectory”加载“SomeDLL.dll”和“AnotherDLL.dll”但是我也希望能够加载“SomeDLL2.dll”、“AnotherDLL2.dll”、“YetAnotherDLL”。 dll”等来自“MyAppDirectory”文件夹内的“SubDirectory”文件夹。

我一直在做一些搜索,从我发现的唯一解决方案是:

  • 1)修改可执行文件的工作目录。
  • 2) 将 DLL 文件放在 Windows 根目录中。
  • 3)修改PATH环境变量。

但是它们都有一些不好的方面(这里不值得一提),这不是我真正需要的。另一个解决方案是通过“应用程序特定路径!” 这涉及使用 Windows 注册表,似乎比前面提到的要好一些。

但是,我需要能够使用 C++ 在“MyApp.exe”中执行此操作,而无需使用外部方法。

我正在使用 MinGW 4.7.2,我的 IDE 是 Code::Blocks 12.11,我的操作系统是 Windows XP SP3 Pro x86。

任何参考、教程、文档、示例等都被接受,感谢您的时间:D

4

2 回答 2

2

如果您没有显式加载 DLL(“手动”,在您的代码中使用LoadLibrary(...)),那么您必须将 .dll 放在 Windows 将查找 DLL 的位置,这几乎意味着您正在谈论的三个选项之一在你的问题中。

使用时LoadLibrary,您可以指定 DLL 的相对或绝对路径。

请注意,显式和隐式加载 DLL 完全不同 - 在显式情况下,您必须使用LoadLibrary, 然后使用GetProcAddress来查找函数的地址,并且您必须使用函数指针来调用函数 - 这通常是仅用于 DLL 提供少量函数的插件或类似功能(通常只是一个工厂函数来创建对象以执行具有通用接口类的操作,并且每个 DLL 具有相同类型的函数来创建一个对象做它应该做的任何事情)。

在隐式加载中,您无需在代码中执行任何操作即可使用 DLL,并且 DLL 中的函数看起来就像是硬链接到应用程序中一样。

于 2013-07-02T09:39:35.380 回答
1

你应该使用

LoadLibrary("subFolder\\dynamicLibrary.dll");

那是到 DLL 的显式链接,它比隐式链接更难(我认为这是你正在使用的),但我相信这是实现你的目的的正确方法

明确的

隐含的

于 2013-07-02T08:31:56.453 回答