1 新建 动态链接库项目Dll1
2 修改Dll1.h
#pragma once
#ifndef _WIN32_DLL_
#define _WIN32_DLL_
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
#ifdef _CACULATOR_
#define DLLMODULE_FUNCTIONTYPE __declspec(dllexport)
#else
#define DLLMODULE_FUNCTIONTYPE __declspec(dllimport)
#endif // _CACULATOR
DLLMODULE_FUNCTIONTYPE int Add(int a, int b);
DLLMODULE_FUNCTIONTYPE int Sub(int a, int b);
DLLMODULE_FUNCTIONTYPE int Mul(int a, int b);
DLLMODULE_FUNCTIONTYPE int Div(int a, int b);
#undef DLLMODULE_FUNCTIONTYPE
#ifdef __cplusplus
}
#endif // __cplusplus
#endif // _WIN32_DLL_
3 修改Dll1.cpp
#include "pch.h"
#include "Dll1.h"
#define _CALCULATOR_
int Add(int a, int b)
{
return a + b;
}
int Sub(int a, int b)
{
return a - b;
}
int Mul(int a, int b)
{
return a * b;
}
int Div(int a, int b)
{
return a / b;
}
4 编译即可
5 创建一个MFC对画框项目NONMFCDLL,修改对话框资源如图 这里是显式调用
6 将上面的Dll1.h和Dll1.dll,Dll1.lib拷贝到该目录下
7 在NONMFCDLLDlg.h里面添加下面代码
#include "Dll1.h"
#pragma comment(lib,"Dll1.lib")
8 实现按钮功能
void CNONMFCDLLDlg::OnBnClickedBtnAdd()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_nResult = Add(m_nNum1, m_nNum2);
}
void CNONMFCDLLDlg::OnBnClickedBtnSub()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_nResult = Sub(m_nNum1, m_nNum2);
}
void CNONMFCDLLDlg::OnBnClickedBtnMul()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
m_nResult = Mul(m_nNum1, m_nNum2);
}
void CNONMFCDLLDlg::OnBnClickedBtnDiv()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (m_nNum2==0)
{
MessageBox(_T("请输入一个不等于0的整数"), _T("Caculator"), MB_OK);
GetDlgItem(IDC_EDIT2)->SetFocus();
return;
}
m_nResult = Div(m_nNum1, m_nNum2);
}
void CNONMFCDLLDlg::OnBnClickedBtnResult()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(false);
}
9 从这里开始是显式调用
去掉上面第6步引入的头文件
10 为NONMFCDLGDLL.h里面添加成员变量
HINSTANCE m_hLib;
11 在NONMFCDLLDlg.cpp的最上面添加下面代码
typedef int (*pAdd)(int a, int b);
typedef int (*pSub)(int a, int b);
typedef int (*pMul)(int a, int b);
typedef int (*pDiv)(int a, int b);
pAdd pAddProc = NULL;
pSub pSubProc = NULL;
pMul pMulProc = NULL;
pMul pDivProc = NULL;
12 在NONMFCDLLDlg的OnInitialDIalog()添加下面的代码
// TODO: 在此添加额外的初始化代码
TCHAR exeFullName[MAX_PATH];
::GetModuleFileName(AfxGetInstanceHandle(), exeFullName, MAX_PATH);
CString strFileName = exeFullName;
int nPos = strFileName.ReverseFind('\\');
if (nPos>0)
{
strFileName = strFileName.Left(nPos);
strFileName += _T("\\Dll1.dll");
m_hLib = ::LoadLibrary(strFileName);
if (m_hLib==NULL)
{
AfxMessageBox(_T("加载DLL失败,请查看DLL1.dll是否存在"));
}
}
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
13 修改按钮事件如下
void CNONMFCDLLDlg::OnBnClickedBtnAdd()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (m_hLib!=NULL)
{
pAddProc = (pAdd)::GetProcAddress(m_hLib, "Add");
if (pAddProc==NULL)
{
AfxMessageBox(_T("请查看Dll1.dll是否正确"));
return;
}
m_nResult = pAddProc(m_nNum1, m_nNum2);
}
}
void CNONMFCDLLDlg::OnBnClickedBtnSub()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (m_hLib != NULL)
{
pSubProc = (pSub)::GetProcAddress(m_hLib, "Sub");
if (pSubProc == NULL)
{
AfxMessageBox(_T("请查看Dll1.dll是否正确"));
return;
}
m_nResult = pSubProc(m_nNum1, m_nNum2);
}
}
void CNONMFCDLLDlg::OnBnClickedBtnMul()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (m_hLib != NULL)
{
pMulProc = (pMul)::GetProcAddress(m_hLib, "Mul");
if (pMulProc == NULL)
{
AfxMessageBox(_T("请查看Dll1.dll是否正确"));
return;
}
m_nResult = pMulProc(m_nNum1, m_nNum2);
}
}
void CNONMFCDLLDlg::OnBnClickedBtnDiv()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);
if (m_nNum2==0)
{
MessageBox(_T("请输入一个不等于0的整数"), _T("Caculator"), MB_OK);
GetDlgItem(IDC_EDIT2)->SetFocus();
return;
}
if (m_hLib != NULL)
{
pDivProc = (pDiv)::GetProcAddress(m_hLib, "Div");
if (pDivProc == NULL)
{
AfxMessageBox(_T("请查看Dll1.dll是否正确"));
return;
}
m_nResult = pDivProc(m_nNum1, m_nNum2);
}
}
void CNONMFCDLLDlg::OnBnClickedBtnResult()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(false);
}