MFC dll

Posted 不会写代码的丝丽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC dll相关的知识,希望对你有一定的参考价值。

相比我们以前的常规c/c++库,我们有时候想添加一些特有mfc资源在里面, 这时候以前的常规库就很难满足我们的需求了。于是微软推出了mfc自己的官方库。

我们新建的库的时候可以看到有三类

但其实我们可以在另一个角度视为两种类别:

  1. mfc常规dll
  2. mfc扩展dll

mfc常规dll可以给MFC工程和c工程使用,内部自己会在新建一个CWinApp对象其内部大致分为两种类别:静态库动态库


class CMFCShareDllApp : public CWinApp
{
public:
	CMFCShareDllApp();

// 重写
public:
	virtual BOOL InitInstance();

	DECLARE_MESSAGE_MAP()
};

但是动态库库需要注意在使用句柄获取资源需要添加AFX_MANAGE_STATE(AfxGetStaticModuleState());如下代码:

	extern "C" BOOL PASCAL EXPORT ExportedFunction()
//		{
//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
//			// 此处为普通函数体
//		}

mfc扩展dll仅能给MFC工程使用,并且也是动态库的一种

不管是哪种库他们都可以给MFC工程使用。

举例我们使用MFC静态库生成一个弹窗

对应的文件:

//MyDlg.h
class MyDlg : public CDialogEx
{
	DECLARE_DYNAMIC(MyDlg)

public:
	MyDlg(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~MyDlg();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DIALOG1 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
};

添加导出文件:

//MyExpose.h 自行定一个导出函数
__declspec(dllexport)
void showMydlg();


//对应实现类
// MyDlg 消息处理程序
#include "MyExpose.h"
#include "MyDlg.h"
void showMydlg() {
	MyDlg dlg;
	dlg.DoModal();
}


在目标工程和常规c库使用即可。

//MyExpose.h 修改工程头文件改为导如
__declspec(dllimport)
void showMydlg();



//导入
#pragma comment(lib,"MFCStaticDll.lib")

int WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) {
	showMydlg();
	return 0;
}

以上是关于MFC dll的主要内容,如果未能解决你的问题,请参考以下文章

WIN10 由于找不到mfc140u.dll,无法继续执行代码

MFC编写DLL窗口功能代码

MFC:Win32-Dll及MFC-Dll编写调用

在共享DLL中使用MFC与在静态库中使用MFC的区别

在共享DLL中使用MFC与在静态库中使用MFC的区别

如何本地化 win32(非 MFC)DLL