当我们开发一个产品的时候,我们并不想把源码公布给对方,除了给对方提供exe可执行文件外,我们还可以生成动态链接库,供程序调用,方便二次开发。
下面我将简单梳理一下如何创建和调用动态链接库,方便大家程序开发。
一、创建动态链接库
这里我们做个减法的例子,比如2-1=1。
1、使用VS2010创建一个win32项目,确定后选择dll选项,完成。
2、在头文件和源文件分别添加dy.h和dy.cpp文件,并在各个文件中添加以下代码
//dy.h文件
#ifndef DYNAMIC
#define DYNAMIC
extern "C" __declspec(dllexport)int sub(int a, int b);
#endif
// dy.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "dy.h"
int sub(int a, int b)
{
return a-b;
}
3、编译即可生成dy.dll和dy.lib
此处需要注意,dy.lib与静态库有本质的区别,他是引入库文件,保存的是dy.dll中导出的函数和变量的符号名,可用于隐式加载dll。
这样,我们就轻松地完成了dll文件的生成。
二、调用动态链接库
本博文主要分享显式加载。
1、创建一个空项目dy_test。
2、将dy.dll和dy.h文件复制到dy_test目录下。
3、在项目中添加dy.h文件,并创建dy_test.cpp文件
4、在dy_test文件添加以下代码
#include
#include
#include
#include "dy.h"
int main()
{
HINSTANCE hDll=NULL;
typedef int(*PSUM)(int a,int b);
PSUM pSum;
hDll = LoadLibrary("dy.dll"); //LoadLibrary(将指定的可执行模块映射到调用进程的地址空间。
//如果调用成功,LoadLibrary函数将返回所加载的那个模块的句柄。
pSum = (PSUM)GetProcAddress(hDll,"sub"); //GetProcAddress获取dll导出函数的地址。
//hDll是指定动态链接库模块的句柄,"sub"是一个指向常量的字符指针,指定dll导出函数的名字或函数的序号。
printf("%d\n",pSum(2,1));
system("pause");
FreeLibrary(hDll);
return 0;
}