在新建对话框上放置2个按钮(隐式和显式调用dll)和1个编辑框(连接变量m_exp),添加按钮响应代码如下(隐式调用时:dll文件要放在对应目录[系统目录或者程序目录]下):
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;
}
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);
}
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;
}
{
// 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;
}
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);
}
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;
}
//Calc.cpp
#include <math.h>
#define N 20
//函数格式如下
extern "C" __declspec(dllexport) double Calc(const char exp[])
{
char ch;
//cout<<exp<<endl;
int add(2),sub(3),mul(4),div(5),op[20],nc(0),oc(0);
double num[N],rel(0);
for(int j=0;j<N;j++)
num[j]=op[j]=0;
j=0;
int len=strlen(exp),i=-1;
while(++i<len)
{
ch=*(exp+i);
if(ch>='0' &&ch<='9' || ch=='+' || ch=='-' || ch=='*' ||ch=='/' ||ch=='(' ||ch==')')
continue;
else
return -99999999.99999;
}
//cout<<strlen(exp)<<endl;
for(i=0;i<strlen(exp);i++)
{
if(exp[i]<58 && exp[i]>47)
{
num[nc]=num[nc]*10+int(exp[i])-48;
//cout<<num[nc]<<' ';
}
else
{
//cout<<exp[i]<<' ';
switch(exp[i])
{
case '+':
op[oc++]=add;
break;
case'-':
op[oc++]=sub;
break;
case'*':
op[oc++]=mul;
break;
case'/':
op[oc++]=div;
break;
case'(':
add+=10;
sub+=10;
mul+=10;
div+=10;
break;
case')':
add-=10;
sub-=10;
mul-=10;
div-=10;
break;
}
//cout<<op[oc-1]<<" ";
}
if(oc>nc)
{
if(op[oc]%10==2){
op[oc--]=0;
break; }
if(op[oc]%10==3)
num[nc]=0;//"-x" => "0-x"
nc++;
}
}
for(int w=0;w<20;w++)
{
j=0;
if(op[0]==0)
break;
int temp=op[0]/2;
for(int i=0;i<20;i++)
if(op[i]/2>temp)
{
j=i;
temp=op[i]/2;
}
switch(op[j]%10)
{
case 2:
rel=num[j]+num[j+1];
break;
case 3:
rel=num[j]-num[j+1];
break;
case 4:
rel=num[j]*num[j+1];
break;
case 5:
rel=num[j]/num[j+1];
break;
}
temp=j;
for(j;j<19;j++)
{
op[j]=op[j+1];
num[j]=num[j+1];
}
num[temp]=rel;
}
// cout<<"The result is "<<num[0]<<endl;
return num[0];
}
#include <math.h>
#define N 20
//函数格式如下
extern "C" __declspec(dllexport) double Calc(const char exp[])
{
char ch;
//cout<<exp<<endl;
int add(2),sub(3),mul(4),div(5),op[20],nc(0),oc(0);
double num[N],rel(0);
for(int j=0;j<N;j++)
num[j]=op[j]=0;
j=0;
int len=strlen(exp),i=-1;
while(++i<len)
{
ch=*(exp+i);
if(ch>='0' &&ch<='9' || ch=='+' || ch=='-' || ch=='*' ||ch=='/' ||ch=='(' ||ch==')')
continue;
else
return -99999999.99999;
}
//cout<<strlen(exp)<<endl;
for(i=0;i<strlen(exp);i++)
{
if(exp[i]<58 && exp[i]>47)
{
num[nc]=num[nc]*10+int(exp[i])-48;
//cout<<num[nc]<<' ';
}
else
{
//cout<<exp[i]<<' ';
switch(exp[i])
{
case '+':
op[oc++]=add;
break;
case'-':
op[oc++]=sub;
break;
case'*':
op[oc++]=mul;
break;
case'/':
op[oc++]=div;
break;
case'(':
add+=10;
sub+=10;
mul+=10;
div+=10;
break;
case')':
add-=10;
sub-=10;
mul-=10;
div-=10;
break;
}
//cout<<op[oc-1]<<" ";
}
if(oc>nc)
{
if(op[oc]%10==2){
op[oc--]=0;
break; }
if(op[oc]%10==3)
num[nc]=0;//"-x" => "0-x"
nc++;
}
}
for(int w=0;w<20;w++)
{
j=0;
if(op[0]==0)
break;
int temp=op[0]/2;
for(int i=0;i<20;i++)
if(op[i]/2>temp)
{
j=i;
temp=op[i]/2;
}
switch(op[j]%10)
{
case 2:
rel=num[j]+num[j+1];
break;
case 3:
rel=num[j]-num[j+1];
break;
case 4:
rel=num[j]*num[j+1];
break;
case 5:
rel=num[j]/num[j+1];
break;
}
temp=j;
for(j;j<19;j++)
{
op[j]=op[j+1];
num[j]=num[j+1];
}
num[temp]=rel;
}
// cout<<"The result is "<<num[0]<<endl;
return num[0];
}