C++ 非MFC DLL的创建及隐式调用和显式调用

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);
	
}

从这里开始是显式调用

去掉上面第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);
	
}

猜你喜欢

转载自blog.csdn.net/dxm809/article/details/113958114
今日推荐