65.9K
CodeProject 正在变化。 阅读更多。
Home

获取 DLL 的路径/名称

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.05/5 (51投票s)

2006 年 11 月 30 日

CPOL
viewsIcon

169179

downloadIcon

1461

两种方法,用于从 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 文件。

© . All rights reserved.