动态链接库:DLL(Dynamic Linkable Library)
kernel32.dll处理内存管理和进程调度
user32.dll控制用户界面
gdi32.dll图形处理
win32 dll
mfc dll
#include<iostream>
#include<windows.h>
using namespace std;
typedef int(*LoadFunc)(int,int);
int main(void)
{
HINSTANCE hInstance;
LoadFunc add;
//加载dll
hInstance=LoadLibrary(L"C:\\Documents and Settings\\liutao6\\桌面\\dlld.dll");
if (hInstance!=NULL)
{
add=(LoadFunc)GetProcAddress(hInstance,"Add");//获取函数地址
if (add!=NULL)
{
int result=add(5,2);
cout<<result<<endl;
}
FreeLibrary(hInstance);//释放dll模块
}
}
extern "C" int __declspec(dllexport) Add(int,int); //导出函数
int Add(int a,int b)
{
return a+b;
}
使用MFC编写的DLL,可以分成两大类:
l 规则DLL——规则(regular)DLL中所包含的函数,可以被所有Windows应用程序使用;
n 共享MFC——DLL中不包含MFC库函数,需要另外安装MFC动态链接库后才能使用;
n 静态MFC——DLL中包含MFC库函数,可以脱离MFC动态链接库独立使用。
l 扩展DLL——扩展(extension)DLL中所定义的类和函数,只能被所MFC应用程序使用。而且扩展DLL中不能包含MFC库函数,也需要另外安装MFC动态链接库后才能使用。
1 扩展DLL
使用MFC编写的扩展DLL,可以导出整个类(从而能使用类中的所有成员,包括数据成员和成员函数),也可以导出指定的若干(成员或全局)函数。
(1)新建MFC扩展DLL
(2)添加导出类(MFC类).继承自Cobject.编写代码并运行
AFX_EXT_CLASS intMod(intd1, int d2);//导出函数声明
class AFX_EXT_CLASS CCompute : public CObject//导出类声明
//#define AFX_EXT_CLASS AFX_CLASS_EXPORT
//#define AFX_CLASS_EXPORT __declspec(dllexport)
{
public:
int m_data1, m_data2;
CCompute();
CCompute(intd1,int d2);
virtual ~CCompute();
public:
int Add();
int Sub();
int Mul();
double Div();
};
(3)新建项目MFC应用程序。选中项目名,选中菜单项“项目\项目依赖项”,在弹出的“项目依赖项”对话框中,选中“依赖栏”中的
(4)新项目的头文件包含头文件#include "..\ExtDll\Compute.h"
(5)在项目的类中声明对象CCompute *m_pComp;
void CExtClientDlg::OnBnClickedAdd()
{
// TODO: 在此添加控件通知处理程序代码
Comp(IDC_ADD);
}
void CExtClientDlg::Comp(UINT nID)//参数为按钮标识
{
UpdateData(); //动态获取用户输入的数据并赋值给对应的控件变量
m_pComp = new CCompute(m_iData1, m_iData2); //创建计算对象
int r;
double dr;
switch(nID) { //进行四则和取模运算
case IDC_ADD: r = m_pComp->Add(); break;
。。。
}
delete m_pComp;
if (nID != IDC_DIV) SetDlgItemInt(IDC_RESULT, r); //显示整数结果
else { // 显示除法所得的实数结果
wchar_t buf[20];
swprintf_s(buf, 20, L"%g", dr);
SetDlgItemText(IDC_RESULT, buf);
}
}
2 规则DLL
使用MFC编写的规则DLL,虽然只能导出函数而不能导出整个类,但是其导出的函数却可以其他被非MFC应用程序所调用。下面我们仍通过上面的四则运算的例子,看看如何用关键字__declspec(dllexport)和extern "C"来编写和使用导出若干(全局)C函数的规则MFC DLL。
使用共享MFC DLL的规则DLL
也可以选择“带静态链接MFC的规则DLL”,差别是所生成的DLL中会包含MFC库,当然所生成的库文件也会大一些(但因此可不用另外安装MFC动态链接库)。例如,在此例中,选共享MFC所生成的RegDll.dll文件只有13KB大,而选择静态MFC的则有199KB。
规则DLL项目是使用共享MFC还是使用静态MFC,也可以在生成DLL项目之后,通过项目属性对话框的“配置属性\常规”页中的“MFC的使用”栏中的下拉式列表选项来切换,这一点与普通MFC应用程序项目的类似。
1.宏定义
#define DllImport extern "C" _declspec(dllimport)
2.Cpp文件中加入
DllExport int Add(intd1,int d2) { return d1 + d2;}
DllExport int Sub(intd1,int d2) { return d1 - d2;}
DllExport int Mul(intd1,int d2) { return d1 * d2;}
3.添加依赖项和头文件方法同上。工程文件cpp中加入
#define DllImport extern "C" _declspec(dllimport)
DllImport int Add(intd1,int d2);
DllImport int Sub(intd1,int d2);
DllImport int Mul(intd1,int d2);
DllImport double Div(intd1,int d2);
DllImport intMod(intd1, int d2);
4.使用函数
Add(m_iData1,m_iData2)