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

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

xuwenyan2年前 (2021-02-04)c++834

第一种:

首先在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自身模块路径的几种方法” 的相关文章

    Visual Studio编译7z源代码

    Visual Studio编译7z源代码

    源代码下载打开地址https://www.7-zip.org/download.html,选择源码下载,可以选择自己需要的版本下载7z.dll编译1:解压源代码包,打开vs解决方案,CPP7zipBundlesFormat7zFFormat7z.dsw,vs会提示升级,不用管,选择升级。2:修改7z...

    7z的简介和使用

    7z的简介和使用

    7z是一个支持多种压缩格式的开源项目,由Igor Pavlov开发,源码下载位置:https://www.7-zip.org/download.html源码结构项目源码目录结构是如下图:Asm包含主要算法实现的汇编代码,直接使用汇编的好处是可以提高运行效率,当然这对跨平台的支持不是很好。C主要是算法...

    C++实现win32窗口文件拖拽

    C++实现win32窗口文件拖拽

    如题,C++如何实现win32窗口文件拖拽,直接上代码 方法1:使用win32消息实现 此方法的弊端在于,无法过滤可以拖拽的文件,拖拽时显示的图标也默认的,无法像资源管理器那样自定义。实现步骤大致分为以下三步: 第一步:首先创建窗口时必须在exStyle加上WS_EX_ACCEP...

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

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

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

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

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

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

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