C ++从子目录加载DLL?

时间:2013-07-02 08:03:31

标签: c++ dll load directory external

我是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

2 个答案:

答案 0 :(得分:2)

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

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

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

在隐式加载中,您不需要在代码中执行任何操作来使用DLL,并且DLL中的函数似乎就像它们被硬链接到应用程序中一样。

答案 1 :(得分:1)

你应该使用

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

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

explicit

implicit