动态链接库:DLL(Dynamic Linkable Library)
kernel32.dll处理内存管理和进程调度
user32.dll控制用户界面
gdi32.dll图形处理
win32 dll
mfc dll
1 #include<iostream> 2 3 #include<windows.h> 4 5 using namespace std; 6 7 typedef int(*LoadFunc)(int,int); 8 9 10 11 int main(void) 12 13 { 14 15 16 17 HINSTANCE hInstance; 18 19 LoadFunc add; 20 21 //加载dll 22 23 24 25 hInstance=LoadLibrary(L"C:\\Documents and Settings\\liutao6\\桌面\\dlld.dll"); 26 27 if (hInstance!=NULL) 28 29 { 30 31 add=(LoadFunc)GetProcAddress(hInstance,"Add");//获取函数地址 32 33 if (add!=NULL) 34 35 { 36 37 int result=add(5,2); 38 39 cout<<result<<endl; 40 41 } 42 43 44 45 FreeLibrary(hInstance);//释放dll模块 46 47 } 48 49 50 51 } 52 53 54 55 56 57 58 59 extern "C" int __declspec(dllexport) Add(int,int); //导出函数 60 61 62 63 int Add(int a,int b) 64 65 { 66 67 return a+b; 68 69 }
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 int Mod(int d1, 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(int d1, int d2); virtual ~CCompute(); public: int Add(); int Sub(); int Mul(); double Div(); };
(3)新建项目MFC应用程序。选中项目名,选中菜单项“项目\项目依赖项”,在弹出的“项目依赖项”对话框中,选中“依赖栏”中的
(4)新项目的头文件包含头文件#include "..\ExtDll\Compute.h"
(5)在项目的类中声明对象CCompute *m_pComp;
1 void CExtClientDlg::OnBnClickedAdd() 2 3 { 4 5 // TODO: 在此添加控件通知处理程序代码 6 7 Comp(IDC_ADD); 8 9 } 10 11 12 13 void CExtClientDlg::Comp(UINT nID)//参数为按钮标识 14 15 { 16 17 UpdateData(); // 动态获取用户输入的数据并赋值给对应的控件变量 18 19 m_pComp = new CCompute(m_iData1, m_iData2); // 创建计算对象 20 21 int r; 22 23 double dr; 24 25 switch(nID) { // 进行四则和取模运算 26 27 case IDC_ADD: r = m_pComp->Add(); break; 28 29 。。。 30 31 } 32 33 delete m_pComp; 34 35 if (nID != IDC_DIV) SetDlgItemInt(IDC_RESULT, r); // 显示整数结果 36 37 else { // 显示除法所得的实数结果 38 39 wchar_t buf[20]; 40 41 swprintf_s(buf, 20, L"%g", dr); 42 43 SetDlgItemText(IDC_RESULT, buf); 44 45 } 46 47 }
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文件中加入
1 DllExport int Add(int d1, int d2) { return d1 + d2;} 2 3 DllExport int Sub(int d1, int d2) { return d1 - d2;} 4 5 DllExport int Mul(int d1, int d2) { return d1 * d2;}
3.添加依赖项和头文件方法同上。工程文件cpp中加入
1 #define DllImport extern "C" _declspec(dllimport) 2 3 4 5 DllImport int Add(int d1, int d2); 6 7 DllImport int Sub(int d1, int d2); 8 9 DllImport int Mul(int d1, int d2); 10 11 DllImport double Div(int d1, int d2); 12 13 DllImport int Mod(int d1, int d2);
4.使用函数
1 Add(m_iData1, m_iData2)