Windows 下怎么在没有HModule的情况下获取 模块自身路径

如果在exe中或方便获取 dll的HMODULE时,获取 自身路径是很方便的,但是有时不方便获取 自身HMODULE却又想得到本模块在磁盘上的路径,有没有办法?

有,看代码:

 


    EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define  QM_7Z_IMG  _T("7z.dll")
    __declspec(dllexport) void Test()
    {

        TCHAR szModuleName[MAX_PATH] = { 0 };
        HMODULE hSubHandle;
        if (GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)&__ImageBase, &hSubHandle))
        {
            if (GetModuleFileName(hSubHandle, szModuleName, MAX_PATH) > 0)
            {
                TCHAR* szLast= _tcsrchr(szModuleName,'\\');
                if (szLast)
                {
                    *szLast = _T('\0');
                   
                    _tcscat_s(szModuleName, MAX_PATH,_T("\\") );
                    _tcscat_s(szModuleName, MAX_PATH, QM_7Z_IMG);
                    MessageBox(NULL, szModuleName, _T("info"), MB_OK);
                }


            }
        }
       
        return;
    }

核心是获取 __ImageBase这个地址,这个是模块加载后就存在的符号,借用它得到本模块的地址,然后使用GetModuleHandleEx来获取 自身的HMoudle , 其它事就简单了。

 

另一种方法:

HMODULE GetSelfModuleHandle()
{
        MEMORY_BASIC_INFORMATION mbi;

        return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0)
                ? (HMODULE) mbi.AllocationBase : NULL);
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值