• dll文件是给别人提供函数的,不会作为一个程序单独去运行,也就是没有什么第一行执行代码的概念
  • 通常都不需要去管DllMain,不会在里面写代码
  • DllMain会在程序运行、程序退出、线程被创建、线程被卸载时被调用
  • dll中的函数并不是都能够提供给其它可执行文件使用,只有导出的函数才可以
    导出的方式有两种:

    • 声明导出
      在函数的声明前加上: extern "C" _declspec(dllexport)
    • def文件导出
      1. #添加一个名为"xxx.def"的文件,并写入以下内容
      2. LIBRARY DLL
      3. DESCRIPTION "my DLL"
      4. EXPORTS
      5. 函数名 @ 序号 ; @1 表示导出函数的序号
      image.png
  • 调用dll中函数的方式,有两种:

    • 隐式调用
      包含头文件,头文件中含有导出函数的声明
      载入lib文件 #pragma comment(lib,””);
      直接调用函数即可
      image.png
    • 显式调用
      (前提:使用显示调用不需要头文件,但是需要知道函数的原型,比如返回值类型,各个参数的类型)
      LoadLibrary() 将目标dll强行加载到本进程中
      GetProcAddress()获得函数的地址 ```cpp

      include

typedef void(*FUN)();

FUN g_Fun; int main(){ HMODULE hModule = LoadLibrary(L”Dll1.dll”); g_Fun = (FUN)GetProcAddress(hModule, “fun1”); g_Fun();

system("pause");

} ```

  • lib文件的差别
    随着dll一起生成的lib文件,称为导入库,里面是没有代码和数据的,是链接信息,供编译器在exe文件与dll文件之间做链接
    还有一种是静态对象库,编译的时候会将静态库中使用到的代码数据编译到exe中,exe发布就不需要携带很多文件

image.png