【2021.01.06】隐式链接

隐式链接

  1. DLL编译完成后生成*.dll与*.lib,但其生成的*.lib文件与静态链接库的不同,动态链接库中的*.lib里不包含代码,只包含一些辅助性的信息。
  2. 代码完全在*.dll中,所以只使用*.dll单文件也可以使用,但是只能使用显式链接(加载DLL、获取函数地址、释放DLL)。
  3. 如果有了*.dll与*.lib文件即可使用隐式链接。
  • 将 *.dll 与 *.lib 放到工程目录中。
  • 将 #pragma comment(lib, "DLL名称.lib") 添加到调用文件中。
  • 加入函数的声明:__declspec(dllimport) 调用约定 返回类型 函数名称 (参数列表);
  1. __declspec(dllimport) __stdcall int Plus (int x, int y);
  2. __declspec(dllimport) __stdcall int Sub (int x, int y);
  • 然后像使用自己的函数一样,使用自己的函数一样没有区别:
  1. int a = Plus(1, 2);
  2. int b = Sub(5, 1);
  • 注意:
  1. extern "C" _declspec(dllexport) 调用约定 返回类型 函数名 (参数列表);
  2. extern "C" _declspec(dllimport) 调用约定 返回类型 函数名 (参数列表);

 

DllMain函数

DLL的Main函数可能会执行多次。

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{

    return TRUE;
}
参数作用
hModule被加载到什么位置
ul_reason_for_call被调用的原因
lpReserved

If fdwReason is DLL_PROCESS_ATTACH, lpvReserved is NULL for dynamic loads and non-NULL for static loads.

If fdwReason is DLL_PROCESS_DETACH, lpvReserved is NULL if FreeLibrary has been called or the DLL load failed and non-NULL if the process is terminating.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值