2013-07-02 34 views
5

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

防爆:

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

所以“MyApp.exe将”自动加载“SomeDLL.dll”和“AnotherDLL.dll”从它的根文件夹“MyAppDirectory”不过,我也希望能够加载“SomeDLL2.dll”,“ “MyAppDirectory”文件夹中的“SubDirectory”文件夹中的“AnotherDLL2.dll”,“YetAnotherDLL.dll”等。

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

  • 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

+0

你所有的三个分项列表都是坏主意。不要做任何这些。 –

+0

[变更静态链接DLL的DLL搜索路径]的可能的重复(http://stackoverflow.com/questions/3832290/altering-dll-search-path-for-static-linked-dll) – MSalters

回答

2

,如果你不明确的加载DLL(“手动”,在使用LoadLibrary(...)您的代码),那么你必须有一个地方.dll文件,Windows将查找DLL的,whihc几乎意味着一个在你的问题中你谈论的三个选项中的哪一个。使用LoadLibrary时,可以指定DLL的相对或绝对路径。

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

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

+0

非常感谢你的回答我的问题的扩展答案:D –

+0

如果这回答你的问题,请做这样的标记。 –

+0

对不起。进一步记录您的答案并忘记确认时,我被某人分散注意力。 –

0

您应该使用

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

这是明确的链接DLL文件,它比强硬一点隐式连接(我认为这是你使用的是什么),但我认为,这是实现你的目的的正确方法

explicit

implicit

+0

此方法特定于MSVC或者我可以在MinGW(gcc)等其他编译器中使用它? –

+0

这是一个WinAPI,所以你可以在每个编译器中使用,你只需要包含和链接Kernel32.lib 显然它只适用于Windows –

+0

不可以。你应该使用绝对路径。 –