初识DLL之MFC动态调用DLL

工作了竟然走上了VC的道路,初次接触MFC调用DLL,,没什么内涵,只要按照步骤都能实现,对MFC本质了解并不是很多!

推荐一篇博文VC++动态链接库(DLL)编程深入浅出(zz)

题目如下:

请使用VC 6.0编写一个DLL,并编写一个调用程序测试该DLL。主要包括以下功能:

(1)计算两个double类型数的乘积(DLL)。

(2)将两个字符串拼接成一个字符串返回(DLL)。

(3)返回操作系统当前时间(DLL)。

(4)此外,测试程序请使用动态调用方式使用动态库。

实现如下:

1、使用VC++6.0新建一个Dynamic-Link Library 工程

添加头文件lib.h

<span style="white-space:pre">	</span>//lib.h
	#define work1 __declspec(dllexport) //声明为DLL导出函数
	//extern "C" 表示声明为C编译、连接方式的外部函数
	extern "C" work1 double mutiply(double x,double y);
	extern "C" work1 int stringcat(char* str,char* str1,char* str2);
	extern "C" work1 int getSystemTime(char *t);
源文件:lib.cpp
//lib.cpp

#include"lib.h"

double mutiply(double x,double y)
{
	return x*y;
}
int stringcat(char* str,char* str1,char* str2)
{
	strcpy(str,str1);<span style="white-space:pre">	</span>//之前直接使用srcat(str1,str2),导致内存泄露,程序直接崩溃了,原因是str1空间不够存放str1+str2,容易犯错
	strcat(str,str2);
	if(str1 == NULL)
		return 0;
	return 1;
}

int getSystemTime(char *time)
{
	SYSTEMTIME sys;//利用windows API 实现
	GetLocalTime(&sys);
	sprintf(time,"%4.4d-%2.2d-%2.2d %2.2d:%2.2d:%2.2d:%2.2d 星期%1d",sys.wYear,sys.wMonth,sys.wDay,
		sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
	if(time == NULL)
		return 0;
	return 1;
}
2、新建MFC工程,实现界面布局,动态调用DLL

动态调用方式,首先定义指针函数,用于获取导出函数的入口地址,这样才能调用DLL导出的函数

typedef double(*lpMuti)(double x,double y);
typedef int(*lpStringCat)(char* str,char* str1,char* str2);
typedef int(*lpGetTime)(char* time);

界面布局:


初识DLL之MFC动态调用DLL_第1张图片

点击“乘法按钮”:

void CWorktestDlg::OnButton1()
{
	// TODO: Add your control notification handler code here
	CString str1,str2;
	GetDlgItem(IDC_EDIT1) -> GetWindowText(str1); //获取文本框输入的值
	GetDlgItem(IDC_EDIT2) -> GetWindowText(str2);
	double value1,value2;
	value1 = atof(str1); //将CString转化为double类型(float)
	value2 = atof(str2);
	lpMuti mutiFun;
	HINSTANCE hDll;  //获取句柄
	hDll = LoadLibrary(Path);//加载动态库,path为.dll所在路径
	if(hDll != NULL)
	{
		CString text;
		double result;
		mutiFun = (lpMuti)GetProcAddress(hDll,"mutiply");//获取dll导出函数地址
		if(mutiFun != NULL)
		{
		
			result = mutiFun(value1,value2);
			text.Format("%lf",result); //double类型转换为CString类型
			GetDlgItem(IDC_RESULT) -> SetWindowText(text);//设置文本框的值
		}
	}
	FreeLibrary(hDll);
}

点击“连接按钮”:

void CWorktestDlg::OnButton2() 
{
	// TODO: Add your control notification handler code here
	CString str1,str2;
	GetDlgItem(IDC_EDIT3) -> GetWindowText(str1);
	GetDlgItem(IDC_EDIT4) -> GetWindowText(str2);
	char str[MAX_SIZE];
	//memset(str,0,sizeof(str));
	HINSTANCE sDll;
	sDll = LoadLibrary(Path);//加载动态库	
	lpStringCat stringCat;
	if(sDll != NULL)
	{
		stringCat = (lpStringCat)GetProcAddress(sDll,"stringcat");
		if(stringCat != NULL){
			stringCat(str,(LPSTR)(LPCTSTR)str1,(LPSTR)(LPCTSTR)str2);//<span style="font-family: Arial, Helvetica, sans-serif;">(LPSTR)(LPCTSTR)强制转换为char*类型</span>

			GetDlgItem(IDC_EDIT5) -> SetWindowText(str);
		}
	}
	FreeLibrary(sDll);
}

点击“获取时间”按钮:

获取时间有很多方法,此处使用windows提供的API实现,还可以用c标准库函数实现


void CWorktestDlg::OnButton3() 
{
	// TODO: Add your control notification handler code here
	HINSTANCE hDll;
	hDll = LoadLibrary(Path);//加载动态库
	lpGetTime getTime;
	if(hDll != NULL)
	{
		getTime = (lpGetTime)GetProcAddress(hDll,"getSystemTime");
		if(getTime != NULL)
		{
			char *time;
			time = (char*)malloc(MAX_SIZE*sizeof(char));//有点多此一举,直接定义一个字符数组即可了
			memset(time,0,MAX_SIZE*sizeof(char));
			getTime(time);
			MessageBox(time);
			//CString text;
			//text.Format(_T("%d"),t);
			GetDlgItem(IDC_TIME) -> SetWindowText(time);
		}else{
			CString time = "1900-7-1 00:00:00";
			GetDlgItem(IDC_TIME) -> SetWindowText(time);
		}
	}
	FreeLibrary(hDll);
}


你可能感兴趣的:(mfc,vc++)