1. 首页>动态要闻 > 信息

怎么把mfc打包成dll

作者:李龙一
2020-05-12
信息

1. 如何将MFC资源文件打包成dll

将MFC资源文件打包成dll 项目中经常会遇到主程序的资源文件是在一个dll中,就是把资源文件部分任务提取出来,比如添加各种语言的字7a686964616fe59b9ee7ad9431333361323531符串,各种图标,各种版本的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. MFC程序怎么封装成DLL

如果使用的是VISUAL STUDIO:

1、从“文件”菜单中,选择“新建”,然后选择“项目…”.

2、从“项目类型”窗格中选择“Visual C++”下的“Win32”.

3、从“模板”窗格中,选择“Win32 控制台应用程序”.

4、为项目选择一个名称,如“MathFuncsDll”,并将其输入“名称”字段.为解决方案选择一个名称,如“DynamicLibrary”,并将其输入“解决方案名称”字段.

5、按“确定”启动 Win32 应用程序向导.在“Win32 应用程序向导”对话框的“概述”页中,按“下一步”.

6、从“Win32 应用程序向导”中的“应用程序设置”页中,选择“应用程序类型”下的“DLL”(如果可用),或者选择“控制台应用程序”(如果“DLL”不可用).某些版本的 Visual Studio 不支持使用向导创建 DLL 项目.您可以稍后对此进行更改,以将项目编译为 DLL.

7、从“Win32 应用程序向导”的“应用程序设置”页中,选择“附加选项”下的“空项目”.

3. 如何将MFC生成的exe转换为DLL

新建一个DLL工程,比如MyDLL,将原工程中的*.h 和 *.cpp文件复制到新建的工程目录下,并添加到工程中。同样的方式导入res文件,不用再去建一遍对话框。我的做法是,新建的工程和原工程同名,然后仅在MyDLL.h中添加相应的头文件,最关键的一步是添加dll函数接口:

在MyDLL.h中添加

extern "C" __declspec(dllexport) void ShowDentalViewDlg(void);// "C"很必要,多个教程中强调,不加的话,由于C++编译器为函数添加类型名,可能导致在其他程序中调用无法找到对应的函数

然后在MyDLL.cpp中实现它:

extern "C" __declspec(dllexport) void ShowDentalViewDlg(void)

{

CDentalViewDlg dlg;

dlg.DoModal();

}

4. 如何把MFC界面封装为DLL供别人调用

*1、先用mfc向导生成静态dll文件。

*2、编辑增加类;

*3、生成dll文件和lib文件;

*4、将生成的dll和lib,和类的头文件复制到需要引用的文*件exe下;

*/

//导出dll的头文件myClass.h

#define DLLimport __declspec(dllimport)

#define DLLexprot __declspec(dllexport)

class DLLexprot myClass //导出类

{

public:

myClass(void);

~myClass(void);

void fun1();

void fun2();

};

推荐阅读
  • 日照好玩的地方和吃海鲜应该去哪听说日

    日照好玩的地方:万平口:"旅游来日照,必到万平口",已成为各地游客的共识。刘家湾赶海园:以赶海系列活动为主,集旅游、休闲、度假、民俗、健身于一体的综合旅游园。竹洞天:位于山东省日照市城区西端的将帅沟毛竹…

    信息 2024-09-21
  • 什么是铸造

    铸造是指将室温中为液态,但不久后将要固态化的物质倒入特定形状的铸模待其凝固成形的加工方式。 被铸物质多半原为固态但加热至液态的金属(例:铜、铁、铝、锡、铅等),而铸模的材料可以是沙、金属甚至陶瓷。 因应…

    信息 2024-09-21
  • 变形金刚中博派和狂派各有哪些人物

    博派:擎天柱,铁皮,大黄蜂,爵士,棘齿。狂派:威震天,红蜘蛛,眩晕,吵闹,萨克,碎骨魔,路障,迷乱。…

    信息 2024-09-21
  • 一平方毫米的铜线能过多少安的电流

    1平方毫米的铜线在不同电流下通过的安培数不同。最大是18A:(1)60A以下,选1平方毫米的铜线安全载流量是6A;(2)60~100A,选1平方毫米的铜线,安全载流量是5A;(3)100A以上,选1平方毫米的铜线,安全载流量是2.5A 。…

    信息 2024-09-21
  • 中华人民共和国城乡规划法第四十条有规

    自2008年1月1日起施行的《中华人民共和国城乡规划法》第四十条:在城市、镇规划区内进行建筑物、构筑物、道路、管线和其他工程建设的,建设单位或者个人应当向城市、县人民政府城乡规划主管部门或者省、自治区、直辖…

    信息 2024-09-21