运行时 DLL 装载


APP 调用 LoadLibrary 或者 LoadLibraryEx ,系统按照 DLL 搜索顺序找到 DLL 文件,若成功就将 DLL 文件映射到进程的地址空间中,并加引用。如果已经加载了,则只增加引用。注意,同名不同路径系统不认为是一个 DLL [1]

如果之前没有调用过LoadLibrary(Ex)或者LoadLibrary(Ex)FreeLibrary都是配对使用的,那么OS在调用LoadLibrary(Ex)的当前线程中调用入口点函数。

 

OS找不到DLL或入口函数返回 FALSELoadLibrary(Ex)返回NULL;否则返回DLL模块句柄,此句柄可用于GetProcAddress, FreeLibrary, FreeLibraryAndExitThreadGetModuleHandle 针对已装入的DLL获取DLL句柄,GetModuleFileName则从句柄获得文件绝对全名。

运行时动态链接允许APP灵活处理DLL文件找不到的情况,例如尝试一下其它的文件名,或报错,或请用户指定正确的DLL文件路径。

注意:动态链接的DLL只能看到那些它装入(即LoadLibrary调用)之后的线程,因此对于要针对进程中所有线程进行操作的应用,需要参考MSDNUsing Thread Local Storage in a Dynamic-Link Library

下面的代码演示了生成时附加lib库和运行时直接装入的区别。

#include <stdio.h>

#include <windows.h>

typedef int (*MYPROC)(LPTSTR);

VOID main(VOID)

{

    HINSTANCE hinstLib;

    MYPROC ProcAdd;

    BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

    // Get a handle to the DLL module.

    hinstLib = LoadLibrary(TEXT("myputs"));

    // If the handle is valid, try to get the function address.

    if (hinstLib != NULL)

    {

        ProcAdd = (MYPROC) GetProcAddress(hinstLib, TEXT("myPuts"));

        // If the function address is valid, call the function.

        if (NULL != ProcAdd)

        {

            fRunTimeLinkSuccess = TRUE;

            (ProcAdd) (TEXT("Message via DLL function/n"));

        }

        // Free the DLL module.

        fFreeResult = FreeLibrary(hinstLib);

    }

    // If unable to call the DLL function, use an alternative.

    if (! fRunTimeLinkSuccess)

        printf("Message via alternative method/n");

}



[1] 那意味着可以将多个同名DLL放在不同路径而被APP多次加载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值