📄 稿件模板.htm
字号:
<table width="145%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<p align="center"><b>VC++6.0动态链接库DLL的编写和调用(四则表达式计算)</b><br><br>
作者:<a href="mailto:x828@163.com">杨建敏</a></p><a href="calc.rar">下载工程代码</a><br>
<br>
</p>
<img border="0" src="calc0.jpg"><br>
运行图示<br>
<br>
1、先编写MFC DLL,打开VC++6.0 => File => New => Project => MFC AppWizzard(dll),在 Project name 里<br>
输入Calc =>Next => Finish. 好了,现在你打开Workspace的FileView就可以看到已经有Calc.h、Calc.cpp、<br>
stdafx.h、stdafx.cpp这4个文件了。<br>
<br>2、我们只要向Calc.cpp里面加入dll函数代码就可以了,如下:
<pre>
// Calc.cpp
#include <math.h>
#define N 20
extern "C" __declspec(dllexport) double Calc(const char exp[])
{
char ch;
int add(2),sub(3),mul(4),div(5),op[20],nc(0),oc(0);
double num[N],rel(0);
….//具体参见源代码
return num[0];
}</pre>
代码完毕,运行就可以了,会生成一个Calc.dll 文件(还有个Calc.lib,不过这个文件我们现在不用它的)<br>
<br>
3、现在建立一个对话框工程(工程名CalcTest)来调用刚才我们编写的dll。在对话框界面上放置一个编辑框<br>
(EditBox)和2个按钮(Button)分别用来接收表达式输入(显示结果)、隐式调用dll和显式
调用dll;并且为编辑<br>
框连接一个变量m_exp. 代码如下:
//按钮1:隐式调用dll。<pre>
void CCalcTestDlg::OnButtonYinshi()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_exp.IsEmpty())
{
AfxMessageBox("请先输入四则运算表达式:");
return;
}
if(!TestExp(m_exp))
{
AfxMessageBox("格式错,请输入类似 \n -(-5+3*2)/2+1 \n这样的四则表达式");
return;
}
//如果dll文件不在系统目录或者程序当前目录下,请更改下句的路径
HMODULE hDll=::LoadLibrary(".\\Calc.dll");//加载链接库
if(hDll==NULL){
MessageBox("找不到Calc.dll,加载动态链接库失败","Warning",MB_OK|MB_ICONWARNING);
return;}
typedef double (*pShow)(const char *);
pShow Show=(pShow)::GetProcAddress(hDll,"Calc");
if(Show==NULL)
MessageBox("函数调用失败","Warning",MB_OK|MB_ICONWARNING); //调用加载动态链接库失败
else
m_exp.Format("%f",Show(m_exp));
FreeLibrary(hDll);
UpdateData(false);
}
//按钮2:实现显式调用dll(手动查找dll文件所在位置)
void CCalcTestDlg::OnButtonXian()
{
// TODO: Add your control notification handler code here
UpdateData(true);
if(m_exp.IsEmpty())
{
AfxMessageBox("请先输入四则运算表达式:");
return;
}
if(!TestExp(m_exp))
{
AfxMessageBox("格式错,请输入类似 \n -(-5+3*2)/2+1 \n这样的四则表达式");
return;
}
CString filter,strPath;
filter="Dll(*.dll)|*.dll||";
CFileDialog dlg(TRUE,NULL,"Calc.dll",OFN_HIDEREADONLY,filter);
if(dlg.DoModal()==IDOK)
strPath=dlg.GetPathName();
HMODULE hDll=::LoadLibrary(strPath);//加载链接库
if(hDll==NULL){
MessageBox("加载动态链接库失败","Warning",MB_OK|MB_ICONWARNING);
return;}
typedef double (*pShow)(const char []);
pShow Show=(pShow)::GetProcAddress(hDll,"Calc");
if(Show==NULL)
MessageBox("函数调用失败","Warning",MB_OK|MB_ICONWARNING); //调用加载动态链接库失败
else
m_exp.Format("%f",Show(m_exp));
FreeLibrary(hDll);
UpdateData(FALSE);
}
bool CCalcTestDlg::TestExp(const char *str)
{
char ch;
int len=strlen(str),i=0;
while(len)
{
ch=*(str+i++);
if(i==len+1)
return true;
if(ch>='0' &&ch<='9' || ch=='+' || ch=='-' || ch=='*' ||ch=='/' ||ch=='(' ||ch==')')
;
else
return false;
}
return true;
}
</pre>
好了,运行程序,输入四则表达式,若dll文件位置正确,隐式调用按钮马上可以得到运算结果,显式的需要<br>
先弹出对话框查找calc.dll文件位置.(此程序暂时只支持带+-*/和负号、括号的整型四则运算,如果
你想要更<br>
多的功能,你也可以自己添加数据类型的处理实现复杂运算)。<br>
<br>
[若有运行问题,请联系 x828@163.com或者QQ93311240]
</td>
</tr>
</table>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -