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