• 当程序调用dll时获取dll路径,DLL中获取自身的句柄


    当程序调用dll时,获取dll路径的方法:

        HMODULE hMod = GetModuleHandle(_T("axload.dll"));
        if (hMod != NULL)
        {
            TCHAR szBuffer[MAX_PATH] = { 0 };
            GetModuleFileName(hMod, szBuffer, sizeof(szBuffer)/sizeof(TCHAR)-1);
    
            _DEBUG_OUT("path: %s
    ", szBuffer);
        }

     
     http://blog.csdn.net/tmt123421/article/details/52809612

    由于 dll 自身无法执行,需要别的程序调用。

    这样就造成了如下问题:如果想在 dll 中获取 dll 自身的路径、名称,就不好办了!

    GetCurrentDirectory() 只能获取到调用主程序的路径;
    GetModuleFileName() 只能得到 dll 的句柄后才能工作;
    • 1
    • 2
    • 1
    • 2

    写死在参数里倒是可以用,但是如果改变名称,就会失效,相当于在程序里埋了一颗雷!

    HMODULE hMod = GetModuleHandle(_T("ntdll.dll"));

    最后终于找到了方法:

    方法1:

    注意:TRUE会导致DLL引用计数加1,FALSE不会改变引用计数,通常用FALSE  
    HMODULE GetCurrentModule(BOOL bRef/* = FALSE*/)  
    {  
        HMODULE hModule = NULL;  
        if (GetModuleHandleEx(bRef ? GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS : (GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS   
        | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT),    (LPCSTR)GetCurrentModule, &hModule))  
        {  
            return hModule;  
        }  
    
        return NULL;  
    }  

    方法2:

        参考:http://blog.csdn.net/yaosan/article/details/3459756  
        HMODULE GetSelfModuleHandle()  
        {  
            MEMORY_BASIC_INFORMATION mbi;  
    
            return ((::VirtualQuery(GetSelfModuleHandle, &mbi, sizeof(mbi)) != 0)   
                  ? (HMODULE) mbi.AllocationBase : NULL);  
        }  

    ======> DLL中如何获取自身的句柄 <======

    http://blog.csdn.net/tmt123421/article/details/52813178

  • 相关阅读:
    LVM磁盘逻辑卷扩容
    confluence 搭建总结
    GTX1050ti安装tensorflow2.0(gpu)
    sublime text 配置 markdown和预览
    Python 程序打包成 exe 可执行文件
    devc++ 配置openCV
    Ubuntu安装sublime text3
    sublime text 配置Miniconda编译环境
    sublime text 配置devc++ 编译环境
    2013-03-27 problem2 A Famous ICPC Team
  • 原文地址:https://www.cnblogs.com/findumars/p/5936702.html
Copyright © 2020-2023  润新知