项目中经常会遇到主程序的资源文件是在一个dll中,就是把资源文件部分任务提取出来,比如添加各种语言的字符串,各种图标,各种版本的Dlg或者Menu等等。改好之后,只需要build下就可以生成包含各念察种资源文件的dll,主程序只需要去调用这个dll即可。
在软件工程中,很多项目都要这样做,因为资源和逻辑分离,这样就可以做到低耦合。
下面开始介绍如何祥高枣将MFC多文档程序的资源文件打包成dll:
创建MFC程序,工程名为Main,然后一直点下一步,就创建好了一个多文档应用程序。
删除该工程的Resource.h和Main.rc,注意:这里是Remove不是Delete,VC6.0删除只是从工程中删除,文件还在;VS2005以上版本会提示Remove还是Delete。
在当前工程中添加一个MFC扩展Dll项目,工程名为Main_Res;
删除Resource Files下所有文件(Remove即可),删除Resource.h(Delete);然后Copy主程序Main的Res到Main_Res的Res中;右键Header Files,Add Existing Item,选择Main中的Resource.h,右键Resource Files,Add Existing Item,选择Main中的Main.rc。
编译Main_Res项目,生成Main_Res.dll;
在Main项目中,Main.h中include的Resource.h可以修改成../Main_Res/Resource.h也可以不修改,因为原来的Resource.h没有彻底删除,编译的时候还是可以找到的,在头文件中添加变量HINSTANCE m_hResourceDll;Main.cpp的InitInstance()最前面添加如下代码:
[cpp] view plain copy
Class View中,右键CMainAPP属性,添加ExitInstance,代码如下:
[cpp] view plain copy
int CMainApp::ExitInstance()
{
// TODO: Add your specialized code here and/or call the base class
if (m_hResourceDll)
{
AfxFreeLibrary(m_hResourceDll)
}
return CWinApp::ExitInstance()
}
m_hResourceDll = AfxLoadLibrary(_T("Main_Res.dll"))
if (m_hResourceDll)
{
AfxSetResourceHandle(m_hResourceDll)
}
else
{
MessageBox(NULL, _T("Load Main_Res.dll failed!"), _T("Error"), 0)
return FALSE
}
编译运行Main项目即可。
注意:
这里调用资源dll的方式为动态(显式)调用,静态(隐式)调用会load资源失败。貌似将主程序的资源文件提取到dll中的话,谨拆只能采用动态(显式)调用。
静态调用的时候,运行会Crash
[cpp] view plain copy
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_MAINFRAME))
{
delete pMainFrame
return FALSE
}
因为LoadFrame(IDR_MAINFRAME)会失败,然后delete pMainFrame的时候就会内存访问非法!肯定是因为IDR_MAINFRAME资源没有找到。具体原因找到后我会更新说明下。
如果不在dll项目中删除Resource Files下所有文件(Remove即可),会编译报错如下:
1>CVTRES : fatal error CVT1100: duplicate resource. type:VERSION, name:1, language:0x0804
1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt
1 新建安装部署项目打开VS,点击新建项目,选择:其他项目类型->安装与部署->安装向导(安装项目也一样),然后点击确定。
2 安装向导
关闭后打开安装向导,点击下一步,或者直接点击完成。
3 开始制作
安装向导完成后即可进入项目文件夹:
双击"应用程序文件冲坦薯夹"在右边的空白处右击,选择添加->文件,将你的做的应用程序的可执行文件和相应的类库和组件添加进来。然后右击你的文件,创建快捷方式,然后把快捷方式分别复制或剪切到左边的"用户的'程序'菜单"和"用户桌面"中。这样安装程序安装完信历成后会在 "开始->所有程序"和"桌面"上生成程序的快捷方式。也可以直接在"用户的'程序'菜单"和"用户桌面"相应目录下新建快捷方式,然后定位到你的文散者件。
然后右击左边的"应用程序文件夹"打开属性对话框:将属性中的"DefaultLocation"的路径中的"[Manufacturer]"去掉,不然的话做好的安装程序默认安装目录会是"C:\Program Files\你的用户名\安装解决方案名称";
然后打开解决方案管理器,右击你的解决方案名称,选择属性:打开的属性页中,选择"系统必备", 在打开的系统必备页中,在"指定系统必备安装组件的位置"中选中如下选择项:从与我的应用程序相同的位置下载系统必备组件。选上以后,在生成的安装文件包中包含.NetFramework组件 。好了,这样就完成99%了,然后点击"生成->生成解决方案",哈,生成成功!
4 制作完成
现在打开解决方案文件夹下的Debug文件夹,就可以看到生成的安装文件了。
5 关于"卸载"功能的添加
上面只介绍了简单的生成安装的方法,但是在VS2005下并没有直接生成卸载程序的功能,所以我们只好用msi来实现了, *** 作方法如下:
在添加你的应用程序项目的时候,多添加一个msiexec.exe进去,这个文件在c:\windows\system32文件夹下,添加进去以后,为了让他更像个卸载程序,把他的名字改成"Uninstall.exe",当然这个关系不大,改不改都行。
然后创建一个快捷方式,放到"开始-程序"中,接下来我们要做的就是查找这个部署项目的ProductCode了,鼠标左键单击项目名称,记住是左键单击,然后点击属性标签,注意:不是右击的属性,这个区别很大,这时你就可以看到ProductCode了。
然后打开你创建的那个快捷方式的属性对话框,在Aguements属性中输入"/x {ProductCode}",好了,然后点击"生成解决方案"即可生成带有卸载功能的安装程序了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)