动态链接库分三种:非MFC链接库,MFC链接库和扩展的MFC链接库;本文章主要介绍非MFC链接库
1 打开VS2010→新建win32项目→命名dll→下一步选中动态链接库dll完成(不能建空文档,否则会出现找不到入口)
2 新建空文件lib.h和lib.cpp
其中lib.h文件中代码如下:
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport) add(int x,int y);//__declspec(dllexport)语句。这个语句的含义是声明函数add为DLL的导出函数。
//DLL内的函数分为两种:DLL导出函数,可供应用程序调用; DLL内部函数,只能在DLL程序使用,应用程序无法调用它们。
#endif
其中lib.cpp文件中代码如下:
#include "lib.h"
int add(int x,int y)
{
return x+y;
}
3 点击生成(不是调试F5,否则报错),在Debug文件夹下产生dll.lib文件和dll.dll(不是lib.dll文件)两个文件
4 新建一个dlltest对话框工程,把生成的dll.dll文件拷贝到该工程文件夹下。
5 动态调用,即需要时调用,不需要时释放
不用声明直接在需要的地方调用,本案例在BOOL CdlltestDlg::OnInitDialog()中调用,代码如下:
typedef int (*lpMyAdd)(int,int);宏定义函数指针类型,与要调用的函数参数和返回值相同
HINSTANCE HDll;//实例一个程序
lpMyAdd oneMyAdd;//实例一个dll中的函数
HDll=LoadLibrary(L"dll.dll");//加载dll
if (HDll!=NULL)//判断是否加载成功
{
oneMyAdd=(lpMyAdd)GetProcAddress(HDll,"add");//获取函数地址
if (oneMyAdd!=NULL)//判断是否获取成功
{
int m=oneMyAdd(10,20);//调用显示
CString cs;
cs.Format(L"%d",m);
AfxMessageBox(cs);
}
}
FreeLibrary(HDll);//释放程序实例;
6 静态调用
需要三个文件一个.h头文件,一个.lib文件,一个.dll文件,把这些文件都考在要调用的程序目录,在程序中添加声明:
#include "1.h"
#pragma comment(lib,"newdllhide.lib")
调用时只需要函数名就行
int b=add(10,20);