1 动态链接库是什么??

是dll文件,广泛的存在于我们的各种程序安装目录下。

2 动态链接库文件有什么用呢??

通常来说,动态链接库文件里面也包含了程序运行所需要的代码和数据。也就是说动态链接库文件也是可执行文件,但是它不能单独运行,动态链接库是给其他可执行文件提供函数的。
比如说一个程序,可能是由一个.exe文件和10个.dll文件组成的。当你双击.exe文件去运行程序的时候,系统也会把其他的10个dll文件加载到内存。

3 使用动态链接库有什么好处呢??

1.增强了模块性,一个使用dll的人,不需要关注功能怎么实现的,只需要包含头文件,然后将dll放到exe所在的目录下,就可以使用其中的函数了。
2.更新软件更为方便, 将程序分成多个部分,更新的时候,也许只需要更新其中几个dll即可。或者更新exe也可以,只要接口没有改变就行。
3.windows通过这种机制去节约内存。比如:CreateWindow这个函数,大多数窗口程序都需要调用。但是如果每个程序的内存空间都有一份此代码的话,就大大的浪费了内存。

4 动态链接库的缺点是什么?

1.假如某一个dll丢失或者损坏了,程序就运行不起来了。
2.相对来说,假如我们使用了静态对象库,那么可以制作一个不依赖其他文件的exe ,发布只需要发布exe即可。

5 dllmain有什么用?

//1 dll文件是给别人提供函数中,不会作为一个程序单独去运行,也就是没有什么第一行执行代码的这种概念。
//2 通常我们都不需要去理会DllMain,不会在里面写什么代码。
//3 DllMain会在 程序运行
//              程序退出
//              线程被创建
//              线程被卸载

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,   //为什么调用这个dll
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH://进程加载

    case DLL_THREAD_ATTACH://线程加载

    case DLL_THREAD_DETACH://线程卸载

    case DLL_PROCESS_DETACH://线程卸载

        break;
    }
    return TRUE;
}

6 dll中的函数并不是都能够提供给其他可执行文件使用,只有导出的函数才可以。导出的方式有两种:

a. 声明导出

在函数的声明前加上: extern "C" _declspec(dllexport)

b. def文件导出


7 调用dll中函数的方式,有两种:

a. 隐式调用

包含头文件,头文件中含有导出函数的声明。
载入lib文件 #pragma comment(lib,“”);
直接调用函数即可

#include "..\Dll1\Dll1.h"
#pragma comment(lib,"..\\Debug\\Dll1.lib")
int main()
{
    fun1();
    fun2();
    system("pause");
}

b. 显示调用:

使用显示调用不需要头文件,但是你需要知道函数的原型(返回值类型,各个参数的类型)。
LoadLibrary()将目标dll强行加载到本进程中。
GetProcAddress()获得函数的地址。
自然就可以调用此函数。

typedef  void(*FUN)();

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

    system("pause");
}

8 lib文件的差别:

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

最后修改:2020 年 08 月 26 日 02 : 58 PM