我是 C++ 的“隐藏/黑暗地方”的新手,我想知道如何从当前可执行文件运行的不同目录或子目录中加载 .dll 文件
Ex:
./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”。 “MyAppDirectory”文件夹内的“SubDirectory”文件夹中的“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
如果您没有显式加载 DLL(“手动”,在代码中使用LoadLibrary(...)
),那么你必须将 .dll 放在 Windows 将查找 DLL 的位置,这几乎意味着你在问题中讨论的三个选项之一。
使用时LoadLibrary
,您可以指定 DLL 的相对或绝对路径。
请注意,显式加载 DLL 和隐式加载 DLL 是完全不同的 - 在显式情况下,您必须使用LoadLibrary
,然后使用GetProcAddress
要查找函数的地址,您必须使用函数指针来调用函数 - 这通常仅用于插件或类似功能,其中 DLL 提供少量函数(通常只是一个工厂函数创建一个对象来执行具有通用接口类的操作,并且每个 DLL 具有相同类型的函数来创建一个对象来执行它应该执行的任何操作)。
在隐式加载中,您无需在代码中执行任何操作即可使用 DLL,并且 DLL 中的函数看起来就在那里,就好像它们硬链接到应用程序中一样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)