mfc dll 小记

前段时间用MFC做一个微型电子白板,之后因为功能需求,需要改成dll模式。
在尝试过程中 我首先将单文档模式改成mfc单文档的dll,修改过程大约增加对rc文件的认识
resouce.h 是rc文件的头文件 rc文件包含了整个工程的 对话框 位图 图标 工具栏等资源 和资源大小 风格 属性 等信息

1 注释:注释格式和C语言相同,单行注释使用//符号。多行注释使用/××/符号。
2 预处理命令:预处理指令包括一些头文件的引用(使用#include,也和C语言相同)
3 编译指令:预定义(#define,常量和宏,  不支持带参数的宏)和条件编译(#if,#ifdef,#undef,#ifndef,#else,#elif,#endif等)
4 资源定义说明:资源定义的声明包括“资源”(Resources),“控件”(Controle),“声明”(Statement)3类
资源迁移的时候 直接把前一个项目的资源迁移过来 然后把代码文件拷贝过来
但是 在单文档dll 退出的时候遇到问题 参见  http://bbs.csdn.net/topics/391996063
后来又在对话框模式下作了一个,画图板用了一个 继承自CView 类的 面板。画图类还是之前的画图类
在将dlg 到 dll 的时候 遇到另外一个问题。
将dlg 的资源 迁移到 mfcdll 项目之后编译没问题 但是运行的时候报错
HWNDCDataExchange::PrepareCtrl(intnIDC)
{
 ASSERT(nIDC!=0);
 ASSERT(nIDC!=-1);//notallowed
 HWNDhWndCtrl;
 COleControlSite*pSite=NULL;
 m_pDlgWnd->GetDlgItem(nIDC,&hWndCtrl);
 if(hWndCtrl==NULL)//这里返回的是NULL
 {
 //CouldbeawindowlessOCX
  pSite=m_pDlgWnd->GetOleControlSite(nIDC);
  if(pSite==NULL)
  { 
   TRACE(traceAppMsg,0,"Error:nodataexchangecontrolwithID0x%04X.\n",nIDC);
   ASSERT(FALSE);
   AfxThrowNotSupportedException();
  } 
 }
 m_idLastControl=nIDC;
 m_bEditLastControl=FALSE;//notanedititembydefault
 returnhWndCtrl;
}

因为 m_pDlgWnd->GetDlgItem(nIDC,&hWndCtrl); 找的是主项目控件ID 所以 在调用的时候需要注意模块状态
切换
MFC规则DLL分为两类:
●静态链接到MFC的规则DLL:与MFC库静态链接,会将MFC类库的代码直接编译生成到DLL文件中,在调用这种DLL的接口时,MFC使用DLL的资源,因此,不需要模块状态的切换,但是缺点就是使用这种方式生成的DLL文件大小比较大。
15:10 2016/10/11。
MFC规则DLL的模块状态切换:
三种方法:
①AFX_MANAGE_STATE(AfxGetStaticModuleState());
② HINSTANCE hSaveInst = AfxGetResourceHandle();
 AfxSetResourceHandle(theApp.m_hInstance);
 ... ... //执行语句;
 AfxSetResourceHandle(hSaveInst);
③ HINSTANCE hExeInst = GetModuleHandle(NULL);
 HINSTANCE hDLLInst = GetModuleHandle(_T("MFCDLL.dll"));
 ASSERT(hExeInst && hDLLInst);
 AfxSetResourceHandle(hDLLInst);
 ... ... //执行语句;
 AfxSetResourceHandle(hExeInst);
★最方便的还是第一种方法,前两种是在DLL导出函数中进行添加,第三种是在EXE程序中进行添加。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值