获取 DLL 的路径/名称
两种方法,用于从 DLL 内部获取 VS2002 或更高版本的 DLL 的路径/名称。
引言
我正在开发一个项目,涉及为游戏编写插件 DLL,而且作为一个懒程序员,我正在使用游戏作者提供的示例并对其进行修改以满足我的需求。我无法访问 DLL 的 HINSTANCE
(就像在使用 MFC DLL 时一样)。当我决定需要知道所提 DLL 的完整路径时,这出现了一个问题。
代码
难以置信的是,只需要三行代码就可以完成这项任务// near the top of your CPP file EXTERN_C IMAGE_DOS_HEADER __ImageBase; // and then, anywhere you need it: LPTSTR strDLLPath1 = new TCHAR[_MAX_PATH]; ::GetModuleFileName((HINSTANCE)&__ImageBase, strDLLPath1, _MAX_PATH);
看起来使用 VS2002(及更高版本)链接器编译的任何 EXE 或 DLL 都会提供一个名为 __ImageBase
的伪变量,它代表模块的 DOS 头(所有 32 位二进制文件都有此变量)。只需将此变量强制转换为 HINSTANCE
,就可以将其作为第一个参数传递给 GetModuleFileName()
。
对于需要在 VC6 或更早版本中使用此功能的人员,请研究 VirtualQuery()
函数。方法类似。
免责声明
我不知道这在 Vista 上是否有效。
示例代码包括源代码以及编译后的 EXE 和 DLL 文件。