码迷,mamicode.com
首页 > 其他好文 > 详细

DLL中如何获取自身的句柄

时间:2015-05-01 01:50:43      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

问题:DLL中如何获取DLL自身所在的文件夹,而不是主调程序的。用GetCurrentDirectory获取的是exe主调程序所在的目录,不符合我的要求;用GetModuleFileName只能在DllMain中才能获取到,因为DllMain第一个参数hInstance就是DLL模块局并,而GetModuleFileName()只有传入DLL模块句柄才能获取DLL路径。

但是,如果不是DllMain项目,而是Win32 DLL勾选MFC选项的项目,入口函数是int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]),没有DllMain那样的入参hInstance,又该如何获取DLL的模块句柄呢?

方法1:传入句柄

 使用一个全局变量保存DllMain中的hInstance,然后在你需要的地方传给::GetModuleFileName。

方法2:传入DLL名称

HMODULE hMod = GetModuleHandle(_T("mydll.dll"));
if(hMod != NULL)
{
    TCHAR szBuffer[MAX_PATH] = {0};
    GetModuleFileName(hMod, szBuffer, sizeof(szBuffer) / sizeof(TCHAR) - 1);
}

方法3:通用办法

TCHAR szDLLFolder[MAX_PATH + 1];
GetModuleFileName(AfxGetApp()->m_hInstance, szDLLFolder, MAX_PATH);

先补充说明一下,VC有三种DLL项目

(1)MFC扩展DLL (dll被加载自动进入入口函数DllMain,但最好通过导出接口来使用)

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)

(2)Win32标准DLL (dll被加载自动进入入口函数DllMain,但最好通过导出接口来使用)

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
(3)Win32勾选MFC选项DLL(dll被加载不会进入函数_tmain(),只能提供导出接口

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])


DLL中如何获取自身的句柄

标签:

原文地址:http://blog.csdn.net/jiangqin115/article/details/45404429

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!