惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
博客园 - 叶小钗
Last Week in AI
Last Week in AI
Google DeepMind News
Google DeepMind News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
P
Proofpoint News Feed
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
aimingoo的专栏
aimingoo的专栏
月光博客
月光博客
量子位
A
About on SuperTechFans
Engineering at Meta
Engineering at Meta
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
博客园 - Franky
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
D
DataBreaches.Net
博客园_首页
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog

博客园 - 流云

编译时找不到xxx.pch [ZT] SQL Server 中四种匹配符的含义[ZT] TAB ORDER按回车键下个控件自动获得焦点 VC获取系统时间、程序运行时间 - 流云 - 博客园 VC常用数据类型使用转换详解 [转] - 流云 - 博客园 VC遍历文件夹下所有文件和文件夹 - 流云 - 博客园 对话框与其控件的颜色 获得指针(文档、视图、框架) 让对话框中的菜单变灰(根据可用性而显示) 获取 本机 SQL SERVER 服务器名 - 流云 用VC++修改注册表----让我们踏出第一步(适合初学者) VC+ADO 连接ACCESS和SQL SERVER的方法 SQL SERVER 数据库备份还原 列表控件ListCtrl的使用 文本读写 CStdioFile流文件 文件读写 CFile 字体对话框FontDialog 颜色对话框ColorDialog VC获取系统时间、程序运行时间
动态链接库DLL的编写和调用(四则表达式计算)
流云 · 2005-05-19 · via 博客园 - 流云

在新建对话框上放置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;        
}

这是用来做四则运算的,dll的编写如下(用MFC建立DLL工程):

这个程序运行后可以进行四则表达式运算(含括号、负号),更多的格式暂时没时间做~~