我是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”文件夹。
我一直在做一些搜索,从我发现的唯一解决方案是:
但他们都有一些不好的方面(这里不值得一提)而且这不是我真正需要的。另一个解决方案是通过“特定于应用程序的路径!”这涉及到使用Windows注册表,看起来比之前提到的稍好一些。
但是我需要能够使用C ++在“MyApp.exe”中执行此操作,而无需使用外部方法。
我使用的是MinGW 4.7.2,我的IDE是Code :: Blocks 12.11,我的操作系统是Windows XP SP3 Pro x86。
接受任何参考,教程,文档,示例等,感谢您的时间:D
答案 0 :(得分:2)
如果您没有显式加载DLL(“手动”,在您的代码中使用LoadLibrary(...)
),那么您必须将.dll放在Windows将查找DLL的位置,这几乎意味着一个您在问题中谈论的三个选项中的一个。
使用LoadLibrary
时,您可以指定DLL的相对路径或绝对路径。
请注意,显式和隐式加载DLL完全不同 - 在显式情况下,您必须使用LoadLibrary
,然后使用GetProcAddress
查找函数的地址,您将必须使用函数指针来调用函数 - 这通常只用于插件或类似的功能,其中DLL提供少量的函数(通常只是一个工厂函数来创建一个对象来做一些具有通用接口的东西) class,每个DLL都有相同类型的函数来创建一个对象来做它应该做的任何事情。)
在隐式加载中,您不需要在代码中执行任何操作来使用DLL,并且DLL中的函数似乎就像它们被硬链接到应用程序中一样。
答案 1 :(得分:1)