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);
}

 

Windows操作系统中,要获取其他进程中运行的程序路径,可以使用WinAPI函数`GetModuleFileName()`或通过进程ID(`PID`)结合`CreateToolhelp32Snapshot()`、`Process32First()`和`Process32Next()`等工具帮助集来进行。以下是一个简单的步骤概述: 1. **使用GetModuleFileName()函数**: - 首先,你需要获得目标进程的句柄,这通常通过`OpenProcess()`函数完成,传入`PROCESS_QUERY_INFORMATION`权限。 - 然后,调用`GetModuleFileName()`函数,提供进程句柄和模块句柄(例如主模块),它会返回该模块的完整路径。 ```cpp HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); TCHAR szFilePath[MAX_PATH]; if (GetModuleFileName(hProcess, szFilePath, MAX_PATH) > 0) { // 文件路径存储在szFilePath中 } CloseHandle(hProcess); ``` 2. **使用Process explorer API(推荐)**: 如果需要更详细的信息,如所有加载的模块,可以使用进程快照技术,比如微软的`psapi.dll`库提供的工具。例如,`CreateToolhelp32Snapshot()`创建一个进程快照,然后遍历通过`Process32First()`和`Process32Next()`找到的每个线程,再获取其对应的模块路径。 ```cpp HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid); MODULEENTRY32 me; ZeroMemory(&me, sizeof(MODULEENTRY32)); me.dwSize = sizeof(MODULEENTRY32); if (Process32First(hSnap, &me)) { do { TCHAR szModuleName[MAX_PATH] = {}; if (GetModuleFileName(me.hModule, szModuleName, MAX_PATH)) { // 模块路径存储在szModuleName中 } } while (Process32Next(hSnap, &me)); } CloseHandle(hSnap); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值