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