加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

DLL中如何获取自身的路径

发布时间:2020-12-13 20:45:18 所属栏目:PHP教程 来源:网络整理
导读:问题: DLL中如何获得DLL本身所在的文件夹,而不是主调程序的。用GetCurrentDirectory获得的是exe主调程序所在的目录,不符合我的要求;用GetModuleFileName只能在DllMain中才能获得到,由于 DllMain 第1个参数hInstance就是DLL模块局并,而 GetModuleFileNa

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

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

方法1:需要传入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); //或GetModuleFileName(::AfxGetResourceHandle(),szDLLFullPath,MAX_PATH); //或GetModuleFileName(::AfxGetInstanceHandle(),MAX_PATH);

先补充说明1下,VC有3种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* envp[])


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读