当前位置:首页 > c++ > 正文内容

C++获取dll自身模块路径的几种方法

xuwenyan3年前 (2021-02-04)c++2779

第一种:

首先在dllmain中保存HMODULE句柄,然后使用GetModuleFileName(HMODULE) 获取,这是一个比较简单直接的方案,但是dll如果内存加载(也就是dllmain无法被正确调用的时候)就无法使用了。

第二种:

通过GetModuleHandleEx传入dll的名称获取其HMODULE,然后再通过GetModuleFileName获取路径。但是当多个装载的模块具有相同的基本名称和扩展名时,GetModuleHandleEx无法预测返回哪个模块的句柄:https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandleexa

HMODULE hModule = nullptr;
::GetModuleHandleEx(0, L"dllModuleName", &hModule);

第三种:

通过函数地址获取其模块句柄,然后通过GetModuleFileName传入模块句柄获取。通过地址获取模块路径又有两种方法,分别如下:

方法1

HMODULE GetSelfModuleHandle() {
  MEMORY_BASIC_INFORMATION mbi;
  if (::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) == 0)
    return nullptr;
     
  return (HMODULE)mbi.AllocationBase;
}

方法2

HMODULE hModule = nullptr;
::GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, (LPCTSTR)&TestFunction, &hModule);

第四种:

通过__ImageBase获取

extern "C" IMAGE_DOS_HEADER __ImageBase;
int main() {
  wchar_t szPath[MAX_PATH] = { 0 };
  ::GetModuleFileName((HMODULE)&__ImageBase, szPath, MAX_PATH);
  return 0;
}
    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/43

    分享给朋友:

    “C++获取dll自身模块路径的几种方法” 的相关文章

    C++如何实现挂起进程、恢复进程

    C++如何实现挂起进程、恢复进程

    1:枚举进程的所有线程,使用SuspendThread函数挂起每一个线程,需要恢复时使用ResumeThread函数恢复。因为挂起和恢复的顺序是不可预知的,所以可能会导致一些多线程程序崩溃,单线程程序可能不受影响。void SuspendProcess(DWORD process...

    C++指针*为什么靠后会比较好?

    C++指针*为什么靠后会比较好?

    大多数书中和大神的代码里,往往指针的*都是靠变量而不是靠类型的,这主要是为了不造成我们第一眼对变量类型的误解和对指针类型的误解,比如: int* p1,p2 我们一眼看上去是不是通常会觉得p1、p1都是一个int*的指针呢?因为我们通常会误把int*当作一个类型,然而无论int*还是i...

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    使用GDI、MFC_GDI、GDI+绘制数组RGBA序列

    学习ffmpeg时遇到一个问题,ffmpeg解码出RGB颜色后怎么绘制到屏幕上,于是将GDI、MFC_GDI、GDI+等方式都记录一下 1:注意按windows的要求,R、G、B、A顺序要调整为B、G、R、A 。 2:GDI不支持透明通道A,透明通道A的值读进去以后没有作用。想要支持透...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    ATL实现windows右键菜单扩展(ContextMenu)

    ATL实现windows右键菜单扩展(ContextMenu)

    右键菜单,即用户右击shell对象时弹出的上下文菜单(context menu)。本文记录了如何创建右键菜单的基本过程,跟着步骤一步一步来,即可创建出一个右键菜单工程。第一步,新建一个ATL工程Visual Studio—>新建项目—>ATL—>使用默认配置(一直按下一步即可)。注...

    C++ 获取进程所在目录(进程全路径)

    C++ 获取进程所在目录(进程全路径)

    打开windows任务管理器,会看到很多的进程在运行,随机挑选一个,如何通过c++代码获取某一个进程的所在全路径呢?这也是在windows软件开发中经常遇到的需求。通过进程名获取进程全路径由于可能很多进程叫同一个名字,所以获得的结果也有可能是多个#include <windows.h...