windows API中的所用函数都是包含在DLL中,其中有三个最重要的DLL,Kernel32.dll它包含用于管理内存,进程和线程的各个函数;User32.dll它包含用于执行用户界面任务的各个函数。
在VC6.0中,动态链接库分为两种,即win32动态链接库和MFC动态链接库。win32动态链接库只包含函数,MFC动态链接库中可以包含图标,光标,位图,对话框等资源,但他并不通用。
我们打开VC6.0,建立一个基于win32DLL的工程,取名为Dll1:
进去后,我们选择一个空的程序,我们引入C++源文件,写入代码:
int add(int a,int b)
{
return a+b;
}
int subtract(int a,int b)
{
return a-b;
}
当你点击运行时就能生成一个Dll1.dll文件。对于其他函数访问一个动态链接库文件,需要将这个动态链接库导出。导出标识符:_declspec(dllexport)
因此我们在int前面加上_declspec(dllexport),表明这个是导出函数,然后点击运行,我们在调试窗口就能看到又有两个文件生成了
.lib文件是一个引入库文件,也就是输入库文件,包含导出的函数以及变量名。
然后测试这两个导出函数,新建一个DllText工程,DllText工程基于MFCexe的对话框工程。
在对话框上加上两个button按钮,ID号为IDC_BTN_ADD以及IDC_BTN_SUBTRACT,然后建立消息响应:
我们看下源码
extern int add(int a,int b);/////表明add函数在外部定义
extern int subtract(int a,int b);/////表明subtract函数在外部定义
void CDllTestDlg::OnBtnAdd()
{
CString str;
str.Format("5+3=%d",add(5,3));
MessageBox(str);
}
void CDllTestDlg::OnBtnSubtract()
{
// TODO: Add your control notification handler code here
CString str;
str.Format("5-3=%d",subtract(5,3));
MessageBox(str);
}
点击运行后,回报错:
编译器不能明确这两个函数的实现,因此报错,之前我介绍了.lib文件里面包含了函数与变量的信息,因此我们引入.lib文件
引入静态文件Dll1.lib,
#pragma comment(linker, "/export:Dll1.lib")你也可以直接在VC菜单栏的工程->属性->链接中设置:
当我们生成工程时,对出现下面的错误:
我们引入Dll1.dll动态链接库,就好了。
我们看下最后的结果: