C++从子目录加载DLL?

San*_*lin 5 c++ directory dll load external

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

例如:

./MyAppDirectory
  /MyApp.exe
  /SomeDLL.dll
  /AnotherDLL.dll
  /SubDirectory
    /SomeDLL2.dll
    /AnotherDLL2.dll
    /YetAnotherDLL.dll
    /...
Run Code Online (Sandbox Code Playgroud)

因此,"MyApp.exe"会自动从其根文件夹"MyAppDirectory"加载"SomeDLL.dll"和"AnotherDLL.dll",但我还希望能够加载"SomeDLL2.dll","AnotherDLL2.dll","YetAnotherDLL".从"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

Mat*_*son 2

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

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

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

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