13 Jun 2012

c++获取dll文件所在的路径

在exe中,可以使用getcwd获得当前路径,一般不会出错,除非使用chdir或者其他函数改变当前路径,dll中如果有dllmain函数,可以使用
char path[_MAX_PATH]; ::GetModuleFileName(NULL, path, _MAX_PATH);
来获得当前路径,有时候需要将调用第一参数指定为调用dll的入口参数中的module
BOOL   APIENTRY   DllMain(
HANDLE   hModule,  
DWORD     ul_reason_for_call,  
LPVOID   lpReserved
)
就是上面的hModule.不过如果dll中不存在dllmain函数,无法用全局变量保存该参数,如何得到dll被动态加载时的路径呢?

经测试有如下办法:

1. 在程序文件中使用全局变量 __ImageBase
在 VC 生成的 dll 中会导出一个特殊的变量 __ImageBase,使用这个变量可以得到当前程序文件对应的 dll 的运行时路径:
extern "C" IMAGE_DOS_HEADER __ImageBase;
char temp[500];
GetModuleFileName((HINSTANCE)&__ImageBase, temp, 500);
这样temp就保存了当前dll被加载时的路径

2. 使用 CWinApp::m_hInstance
如果使用 VC 的向导生成 dll 工程,一般都会自动生成一个从 CWinApp 派生出来的实例,同时实现了两个方法:InitInstance(), ExitInstance()。当然这里关心的是可以使用超类的成员变量 m_hInstance ,通过它可以得到当前程序文件对应的 dll 的运行时路径:
BOOL CZighouseApp::InitInstance()
{
char path[_MAX_PATH];
GetModuleFileName(m_hInstance, path, _MAX_PATH);
return CWinApp::InitInstance();
}

No comments :

Post a Comment