概述
前段时间用MFC做一个微型电子白板,之后因为功能需求,需要改成dll模式。
在尝试过程中 我首先将单文档模式改成mfc单文档的dll,修改过程大约增加对rc文件的认识
在尝试过程中 我首先将单文档模式改成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
将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:与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);
三种方法:
①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);
HINSTANCE hDLLInst = GetModuleHandle(_T("MFCDLL.dll"));
ASSERT(hExeInst && hDLLInst);
AfxSetResourceHandle(hDLLInst);
... ... //执行语句;
AfxSetResourceHandle(hExeInst);
★最方便的还是第一种方法,前两种是在DLL导出函数中进行添加,第三种是在EXE程序中进行添加。
最后
以上就是合适高跟鞋为你收集整理的mfc dll 小记的全部内容,希望文章能够帮你解决mfc dll 小记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复