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发布就不需要携带很多文件。