怎么把mfc做好的程序打包成一个安装包,可以在别的电脑安装运行?

怎么把mfc做好的程序打包成一个安装包,可以在别的电脑安装运行?,第1张

在菜单里选 ”文件“ -->“新建”-->"项目"

会d出 “新建项目” 对话框

在对话框的“项目类型”列表里选“其他项目类型”--->"安装和部署"

对话框的“模板列表里”选“安装项目” 或“安装向导”就会生成一个安装项目

在里面添加生成的“.exe" 等就可以了。

然后编译就可以生成安装包了。

"打包成一个非安装的软件",这个想法不适合带有数据库连接的程序。

使用数据库的程序,必须配置合理的连接参数、安装ADO等连接组件、还需要有数据库。而这些,应该通过安装程序解决。

简单安装程序,可以使用快速打包软件实现,VS2010有一个自带的发布程序(就在菜单里),可以实现自动打包,如果需要进行数据库配置,那么需要通过专用的语言进行编程。

将MFC资源文件打包成dll

项目中经常会遇到主程序的资源文件是在一个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

2、Release版的exe文件链接的是标准的MFCDLL,比如MFC42.dll。这些DLL在安装Windows的时候,就会装到系统中。因此,这样的exe在没安装Visual C++6.0 的机器上也能运行。而Debug版不能,除非使用静态链接3、生成release版的步骤:“工程”——“配置”——“常规”——“使用MFC作为静态链接库”。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11474327.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存