1 新建对话框工程
2 在解决方案中新建项目->Windows桌面向导输入MFCDLL-> 选择DLL,并勾选MFC标头
3 在MFCDLL项目下添加资源,ID设置为ID_DLG_TEST,并创建对应的关联类CTest
#pragma once
#include "afxdialogex.h"
// CTest 对话框
class CTest : public CDialogEx
{
DECLARE_DYNAMIC(CTest)
public:
CTest(CWnd* pParent = nullptr); // 标准构造函数
virtual ~CTest();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DLG_TEST };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
};
// CTest.cpp: 实现文件
//
#include "pch.h"
#include "MFCDLL.h"
#include "CTest.h"
#include "afxdialogex.h"
#include "resource.h"
// CTest 对话框
IMPLEMENT_DYNAMIC(CTest, CDialogEx)
CTest::CTest(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DLG_TEST, pParent)
{
}
CTest::~CTest()
{
}
void CTest::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CTest, CDialogEx)
END_MESSAGE_MAP()
// CTest 消息处理程序
4.修改MFCDLL.cpp
// MFCDLL.cpp : 定义 DLL 的导出函数。
//
#include "pch.h"
#include "framework.h"
#include "MFCDLL.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#include "CTest.h"
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
int main()
{
int nRetCode = 0;
HMODULE hModule = ::GetModuleHandle(nullptr);
if (hModule != nullptr)
{
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
{
// TODO: 在此处为应用程序的行为编写代码。
wprintf(L"错误: MFC 初始化失败\n");
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
}
}
else
{
// TODO: 更改错误代码以符合需要
wprintf(L"错误: GetModuleHandle 失败\n");
nRetCode = 1;
}
return nRetCode;
}
CMFCDLL::CMFCDLL(void)
{
}
extern "C" __declspec(dllexport) void Show()
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
CTest test;
test.DoModal();
}
5 在对话框工程里面添加MFCDLL的引用,并在对话框上面放置一个按钮,实现其按钮事件
void CDLG03222Dlg::OnBnClickedButton1()
{
typedef void (WINAPI* TESTDLL)();
HINSTANCE hmod;
hmod = ::LoadLibrary(_T("MFCDLL.dll"));
if (hmod == NULL) { AfxMessageBox(_T("Fail")); }
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress(hmod, "Show");
if (lpproc != (TESTDLL)NULL)
(*lpproc)();
FreeLibrary(hmod);
}