动态链接库: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 }

 

 

 使用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 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)