初识DLL之MFC动态调用DLL

来源:互联网 发布:最新小非农数据查询 编辑:程序博客网 时间:2024/06/05 14:31

工作了竟然走上了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);

界面布局:


点击“乘法按钮”:

void CWorktestDlg::OnButton1(){// TODO: Add your control notification handler code hereCString 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 hereCString 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 hereHINSTANCE 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);}


0 0
原创粉丝点击