动态调用即显示链接,静态调用即隐式链接。
动态链接库(Dynamic Linked Library)缩写就是将一些api函数写入到一个dll文件中,在程序在程序运行时再加载到程序的进程空间中使用,这样可以让运行程序本身体积较小,方便模块化编程。后缀名一般是.dll。
静态链接库(StaticLibrary)和动态链接库作用基本相同但是静态链接库在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件),所以组成的exe文件体积较大,静态链接库后缀名一般为.lib。
Import导入库就综合了两种库包含两种文件.dll和.lib文件,.dll文件和上面的动态链接库相同,包含导出函数和数据等,但这里的.lib文件就和静态链接库有所不同,这里的.lib文件只是包含一些被DLL导出的函数和变量的符号名,一般称这个lib文件为引入库。
现在,开始编写一个dll,选择win32,然后win32控制台程序,选择DLL,然后在文件名.cpp中写下代码:
// testDLL.cpp : 定义 DLL 应用程序的导出函数。
#include "stdafx.h"//这里保存的是DLL的导出函数
extern "C" __declspec(dllexport) int add(int a, int b)
{
return (a + b);
}
extern "C" __declspec(dllexport) int sub(int a, int b)
{
return (a - b);
}
extern "C" __declspec(dllexport) int msg()
{
MessageBox(NULL,TEXT("第一个dll程序"),TEXT("MY"),MB_OK);
return 0;
}
通过上面的代码编译在Debug中,可以得到一个testDLL.lib文件和一个testDLL.dll文件。然后在写程序来调用这个dll。
隐式链接:
实现一个简单的隐式链接,需要将生成的lib文件放入loadDLL工程文件夹下面,并设置编译器的附加依赖项中增加此lib(也可以直接在代码中增加使用语句如#pragma comment(lib,"testDLL.lib"))
#include <iostream>
#include <windows.h>
#pragma comment(lib,"testDLL.lib")
extern "C"_declspec(dllimport) int add(int a, int b);
extern "C"_declspec(dllimport) int sub(int a, int b);
extern "C"_declspec(dllimport) int msg();
int main()
{
int a = 9;
int b = 3;
int nAdd = add(a, b);
int nSub = sub(a, b);
std::cout << nAdd << ":" << nSub << std::endl;
msg();
system("pause");
return 0;
}
显示链接:
显示链接只需要生成的一个dll文件就能使用了,但是使用较为复杂需要用到指针函数及LoadLibrary等相关知识。在使用dll中的函数时我们首先需要使用导入函数将dll文件导入到进程地址空间再使用GetProcAddress得到dll中的函数地址再使用。
#include <iostream>
#include <windows.h>
int main()
{
typedef int (*_pAdd)(int a, int b);
typedef int (*_pSub)(int a, int b);
typedef int (*_pmsg)();
HINSTANCE hDll = LoadLibrary(TEXT("testDLL.dll"));
int nParam1 = 9;
int nParam2 = 3;
_pAdd pAdd = (_pAdd)GetProcAddress(hDll, "add");
_pSub pSub = (_pSub)GetProcAddress(hDll, "sub");
_pmsg pmsg = (_pmsg)GetProcAddress(hDll, "msg");
int nAdd = pAdd(nParam1, nParam2);
int nSub = pSub(nParam1, nParam2);
pmsg();
std::cout << nAdd << ":" << nSub << std::endl;
FreeLibrary(hDll);
system("pause");
return 0;
}