MFC DLL 的创建和调用 把一个使用MFC类的类封装成dll供MFC程序调用

2025-08-20 03:25:03

1.

新建DLL工程

MFC DLL --> 创建规则 DLL --> 带静态链接 MFC 的规则 DLL

编译生成 .lib .dll 文件

完整.h文件代码

1 // testMfcDll.h : testMfcDll DLL 的主头文件

2 //

3

4 #pragma once

5

6 #ifndef __AFXWIN_H__

7 #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"

8 #endif

9

10 #include "resource.h" // 主符号

11

12

13 // CtestMfcDllApp

14 // 有关此类实现的信息,请参阅 testMfcDll.cpp

15 //

16

17 class CtestMfcDllApp : public CWinApp

18 {

19 public:

20 CtestMfcDllApp();

21

22 // 重写

23 public:

24 virtual BOOL InitInstance();

25

26 DECLARE_MESSAGE_MAP()

27 };

28

29 class __declspec(dllexport) testMfcDll;

30 class testMfcDll

31 {

32 public:

33 testMfcDll(){};

34 virtual ~testMfcDll(){};

35 void sayHello();

36 CString &sayHelloWord();

37 void sayWhat(CString &);

38

39 CString strHello;

40 };

完成.cpp 文件代码

1 // testMfcDll2.cpp : 定义 DLL 的初始化例程。

2 //

3

4 #include "stdafx.h"

5 #include "testMfcDll2.h"

6

7 #ifdef _DEBUG

8 #define new DEBUG_NEW

9 #endif

10

11 //

12 //TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,

13 // 则从此 DLL 导出的任何调入

14 // MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到

15 // 该函数的最前面。

16 //

17 // 例如:

18 //

19 // extern "C" BOOL PASCAL EXPORT ExportedFunction()

20 // {

21 // AFX_MANAGE_STATE(AfxGetStaticModuleState());

22 // // 此处为普通函数体

23 // }

24 //

25 // 此宏先于任何 MFC 调用

26 // 出现在每个函数中十分重要。这意味着

27 // 它必须作为函数中的第一个语句

28 // 出现,甚至先于所有对象变量声明,

29 // 这是因为它们的构造函数可能生成 MFC

30 // DLL 调用。

31 //

32 // 有关其他详细信息,

33 // 请参阅 MFC 技术说明 33 和 58。

34 //

35

36 // CtestMfcDll2App

37

38 BEGIN_MESSAGE_MAP(CtestMfcDllApp, CWinApp)

39 END_MESSAGE_MAP()

40

41

42 // CtestMfcDll2App 构造

43

44 CtestMfcDllApp::CtestMfcDllApp()

45 {

46 // TODO: 在此处添加构造代码,

47 // 将所有重要的初始化放置在 InitInstance 中

48 }

49

50

51 // 唯一的一个 CtestMfcDll2App 对象

52

53 CtestMfcDllApp theApp;

54

55

56 // CtestMfcDll2App 初始化

57

58 BOOL CtestMfcDllApp::InitInstance()

59 {

60 CWinApp::InitInstance();

61

62 return TRUE;

63 }

64

65

66 void testMfcDll::sayHello()

67 {

68 //这是win的MessageBox

69 MessageBox(NULL, _T("hello"), _T("提示"), MB_OK);

70 }

71

72

73 CString& testMfcDll::sayHelloWord()

74 {

75 strHello = _T("hello world");

76 return strHello;

77 }

78

79

80 void testMfcDll::sayWhat(CString &str)

81 {

82 if(str == _T("hello"))

83 {

84 str = _T("get way");

85 MessageBox(NULL, _T("get way"), _T("提示"), MB_OK);

86 }else

87 {

88 MessageBox(NULL, _T("hello"), _T("提示"), MB_OK);

89 }

90 }

2.

新建 MFC 对话框程序调用 DLL

MFC 应用程序 --> 基于对话框 在静态中使用 MFC -->其他选项都是默认

把 DLL 的 .h 文件加入到项目,把编译生成的 .lib 文件加入到项目资源

在对话框程序中增加一个按钮,在按钮的点击消息实现函数中增加代码

1 testMfcDll test;

2 test.sayHello();// hello

3 CString str = _T("hello");

4 str = test.sayHelloWord();

5 test.sayWhat(str);// hello

6 MessageBox(str);// hello world

3.

参考

MFC扩展DLL,函数参数或返回值中有&,调用时报无法解析的外部符号

MFC DLL 选择静态 MFC时,调用的程序也使用“在静态中使用 MFC”

MFC DLL 选择共享 MFC时,调用的程序也使用“在共享中使用 MFC”

MFC 扩展 DLL 使用一些特殊参数例如&,调用时会出现“无法解析的外部符号”,这是静态mfc动态mfc不对应的问题

例如上述例子中 DLL 使用 MFC 扩展 DLL 选项时,只能调用第一个函数,其他2个函数都提示 “无法解析的外部符号”