美文网首页
延迟载入DLL

延迟载入DLL

作者: 7bfedbe4863a | 来源:发表于2018-01-06 18:40 被阅读0次

-一个延迟载入的DLL是隐式链接的,系统一开始不会将该DLL载入,只有当我们的代码试图去引用DLL中包含的一个符号时,系统才会实际载入该DLL。

用处:

-将载入DLL的过程延伸到进程的执行过程中。
-解决函数版本和操作系统版本匹配的问题。

局限:

-一个导出了字段的DLL无法延迟载入。(全局变量)
-Kernel32.dll无法延迟载入。因为载入该DLL才能调用LoadLibrary和GetProcAddress
-不应该在DLLMain入口点函数调用延迟载入的函数。(可能会导致程序崩溃)

使用:

-代码的编写和正常使用相同
-DLL链接选择隐式链接
-设置/DELAYLOAD和/DELAY链接器开关。这两个不能用#pragma comment(...)来设置,要在项目属性中设置。

1. 属性--Linker--Input--Delay Load DLLs--在这一项里填要延迟载入的DLL,注意,不要加路径。
2. 属性--Linker--Advanced--Delay Loaded DLL --这一项选择 Support Unload(/DELAY:UNLOAD)。

这样设置完之后加载DLL就是在使用DLL的元素的时候了。
在使用时,为了方便看出来是在哪里加载的,加了一个判断DLL是否被载入的函数。如下

BOOL IsModuleLoaded(PCTSTR pszModuleName)
{
    HMODULE hmod = GetModuleHandle(pszModuleName);
    if(hmod==NULL)
        return FALSE;
    return TRUE;
}

-其中pszModuleName参数是dll的名称(不加.dll)。
-在第一次调用dll中的函数的前后,IsModuleLoaded分别返回FALSE和TRUE。

相关文章

网友评论

      本文标题:延迟载入DLL

      本文链接:https://www.haomeiwen.com/subject/pqzynxtx.html