zoukankan      html  css  js  c++  java
  • 在DLL中动态加载其所依赖的dll

    windows下LoadLibrary函数的搜索顺序是先搜索system32等系统环境变量path下注册过的路径,然后是当前路径。

    这里的相对路径是指的主exe所在路径,并且相对路径在程序运行过程中可能会发生变化。

    所以,这里就有一个坑:

    1,对于普通的x.dll,一般都是和x.exe在同一个目录下,x.exe直接LoadLibrary x.dll 即可;

    2,对于普通的x.dll依赖的xdep.dll,一般两个dll也是与x.exe在同一个目录下,x.dll直接LoadLibrary xdep.dll也行;

    3,对于COM的x.dll,直接LoadLibrary就不行了,因为x.dll是需要注册的,x.dl和xcomdep.dll的路径不一定与x.exe在同一个目录下,这样x.dll中使用LoadLibrary xcomdep.dll将失败,因为x.dll中得到的相对路径是x.exe的相对路径,而x.exe路径下面并没有xcomdep.dll。

    对于这个问题,可以用下面的一些函数解决:

    //获取当前dll的句柄
    HMODULE GetCurrentDllModule()
    {
        MEMORY_BASIC_INFORMATION m = {0};
        VirtualQuery(GetCurrentDllModule, &m, sizeof(MEMORY_BASIC_INFORMATION));
        return (HMODULE) m.AllocationBase;
    }
    //获取当前dll的全路径
    //如 : e:	est	est.dll
    void GetCurrentDllPath(WCHAR* lpwDllPath)
    {
        HMODULE hThisMod = GetCurrentDllModule();
        GetModuleFileNameW(hThisMod,lpwDllPath,MAX_PATH);
    }
    //获取当前dll的路径
    //如 : e:	est
    void GetCurrentDllRoute(WCHAR* lpwDllRoute)
    {
        GetCurrentDllPath(lpwDllRoute);
        WCHAR* lpwPos = wcsrchr(lpwDllRoute,L'\');
        *(lpwPos+1) = L'';
    }
    //获取与当前dll相同目录的依赖dll的全路径
    //如 : 当前dll依赖于同目录下的test_dep.dll
    //    结果为:e:	est	est_dep.dll
    void GetDepdenceDllPath(const WCHAR* lpcwDepDllName,WCHAR* lpwDepDllPath)
    {
        GetCurrentDllRoute(lpwDepDllPath);
        wcscat(lpwDepDllPath,lpcwDepDllName);
    }
    //动态加载与dll同目录下的dll
    HMODULE LoadDepDll(const WCHAR* lpcwDepDllName)
    {
        WCHAR lpwDepDllPath[MAX_PATH];
        GetDepdenceDllPath(lpcwDepDllName,lpwDepDllPath);
        return ::LoadLibraryW(lpwDepDllPath);
    }
  • 相关阅读:
    使用 JDBC 驱动程序
    (转载)SQL Server 2008 连接JDBC详细图文教程
    (转载)VB中ByVal与ByRef的区别
    (转载)Java里新建数组及ArrayList java不允许泛型数组
    在VS2008环境下编写C语言DLL,并在C++和C#项目下调用 (转载)
    近期计划
    在服务器上使用python-gym出现的关于显示的问题
    字符串匹配
    Ubuntu18.04 桌面系统的个人吐槽(主要是终端)
    Ubuntu18.04上安装N卡驱动、CUDA、CUDNN三连
  • 原文地址:https://www.cnblogs.com/xylc/p/3711013.html
Copyright © 2011-2022 走看看