MFC的DLL中调用函数指针与主程序交互

http://blog.csdn.net/perfecttoday/article/details/3355125

虽然在DLL中定义指向主程序的函数指针,看似程序逻辑有些混乱,但工程实际应用中有时却得这么干,因此简单总结一下,函数指针在开发中的应用。
第一步: 创建一般的动态库工程Win32s1

第二步: 在动态库.h文件中,自定义函数指针类型,声明导出函数
注:导出函数应用到外部主程序的相关计算与结果
typedef float (*outFun)(int, int, int);  //函数指针类型
// typedef + 类型标识 + (指针变量名称) + (参数列表)
SBUI_API void getProfit(outFun fun);   //声明导出函数
注:导出函数的返回类型与函数指针应用无关

第三步: 在动态库的.cpp文件中,实现一个由外部函数执行 + 动态库函数执行的一个动作
void getProfit(outFun fun)
{
 int nGrossIncome    = 90000;  //总收入
 int nLabourCosts    = 1000;   //人工成本
 int nMaterialCosts  = 2000;   //材料成本
 double nNetProfit = fun(
  nGrossIncome, 
  nLabourCosts, 
  nMaterialCosts)/*求得税前利润*/
  * (1 - 0.18);
 char chNetProfit[512] = "/0"; 
 sprintf(chNetProfit, "当期纯利润为 %f", nNetProfit); // #include <stdio.h>
 MessageBox(NULL, chNetProfit, "收益计算", MB_OK|MB_ICONINFORMATION);
}

第四步: 在主程序中实现成本计算函数 setProfit,并调用DLL函数
float setProfit(int _nGrossIncome, int _nLabourCosts, int _nMaterialCosts)
{
 int nSellingCosts = 5000;
 return float(_nGrossIncome - nSellingCosts - _nLabourCosts - _nMaterialCosts);
}
#include "dll1.h"
#pragma comment(lib,"Win32s1.lib")
void CTestDlg::OnButton1() 
{
getProfit(setProfit);
}

以上是别人的例子,但是在mfc中应用上面代码时总是出错,说是

参数 3 从“void (__cdecl *)(void *)”转换为“unsigned int (__stdcall *)(void  *) *

之类的错误,搞不懂内在的原因。
但是将dll中导出函数的参数定义为 :  void getProfit( float  (*outFun) (int, int, int) )
函数编译通过。

在MFC的dll中,导出函数参数的指针函数的声明,最好是以原始函数指针(类型标识 + (指针变量名称) + (参数列表))定义来声明,

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值