c语言mfc如何打包vc6,如何将MFC资源文件打包成dll

将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()最前面添加如下代码: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;

}Class View中,右键CMainAPP属性,添加ExitInstance,代码如下:int CMainApp::ExitInstance()

{

// TODO: Add your specialized code here and/or call the base class

if (m_hResourceDll)

{

AfxFreeLibrary(m_hResourceDll);

}

return CWinApp::ExitInstance();

}

编译运行Main项目即可。

注意:

这里调用资源dll的方式为动态(显式)调用,静态(隐式)调用会load资源失败。貌似将主程序的资源文件提取到dll中的话,只能采用动态(显式)调用。

静态调用的时候,运行会Crash

// 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

DLL的调用方式

顺便说下dll的两种调用方式:动态(显式)调用、静态(隐式)调用

(一).静态调用其步骤如下:

1.把Main_Res.DLL拷到你目标工程(需调用Main_Res.DLL的工程)的Debug目录下,一般将dll的生成目录改成EXE的目录或者在dll项目设置中添加命令

生成dll后将其Copy到EXE所在目录;  2.把Main_Res.lib拷到你目标工程(需调用Main_Res.DLL的工程)目录下,一般都是在Additional Library Directories添加lib的目录;  3.把Resource.h(包含输出函数的定义)拷到你目标工程(需调用Main_Res.DLL的工程)目录下,一般都是在Additional Include Directories添加.h文件的录;  4.打开目标工程选中工程,选择Visual   C++的Project主菜单的Settings菜单,VC6.0是Setting,VS2005以上版本是Properties;  5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library   modules输入框中输入:Main_Res.lib  6.选择你的目标工程Head   Files加入:Resource.h文件;  7.最后在你目标工程(*.cpp,需要调用DLL)中包含你的:#include   "Resource.h "         (二).动态调用:  动态调用时只需做静态调用步骤1,或者load的时候加载绝对路径或者相对路径的dll

m_hResourceDll = AfxLoadLibrary(_T("Main_Res.dll"));

//m_hResourceDll = AfxLoadLibrary(_T("../Main_Res/Debug/Main_Res.dll"));

//m_hResourceDll = AfxLoadLibrary(_T("C:\\Main_Res.dll"));

if (m_hResourceDll)

{

AfxSetResourceHandle(m_hResourceDll);

}

else

{

MessageBox(NULL, _T("Load Main_Res.dll failed!"), _T("Error"), 0);

return FALSE;

}

然后在不用的时候free掉

if (m_hResourceDll)

{

AfxFreeLibrary(m_hResourceDll);

}

我们此处用的是MFC的函数所以LoadLibrary和FreeLibrary前都有Afx,非MFC的话就直接用LoadLibrary和FreeLibrary。

另外本文加载的dll为资源dll,没有函数的;如果加载其他非纯资源dll的话还要用GetProcAddress 获取要使用的函数地址,本文就不再赘述。

源码免积分下载,希望对新手有所帮助。

参考资料:



http://www.360doc.com/content/11/0903/10/6828497_145422981.shtml



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值