首页 > REDM基础教程 > REDM基础教程14-单EXE方式
2016十一月28

REDM基础教程14-单EXE方式

  MyRes+Test下载–>

Test.zip

MyRes.zip

    

    单独的exe工程下载–>

MyTest.zip (MyRes.zip不需要放在exe同目录下,已内嵌)

zlib.zip (放在exe同目录下)

   


    

有时我们只想发一个单独的EXE出去,不想带上DMMain.dll,也不想带上MyRes资源包,这里做下简单的介绍:

   

1.使用DMMain的lib库方式链接, 编译CMake时,把USE_DMDLL_勾选去掉:

 1.png

编译后,我们应该变成了一个Test.exe+MyRes资源包这样的方式运行了

  

2.默认内置的资源包就是一个文件夹,但DM库在插件Plugin_Expand还支持zip打包资源包, 对应的文件是

PlugIns\Plugin_Expand\inc\Res\DMResZipImpl.h
PlugIns\Plugin_Expand\src\Res\DMResZipImpl.cpp

以及它们的辅助文件类:
PlugIns\Plugin_Expand\inc\Res\DMZipHelper.h
PlugIns\Plugin_Expand\src\Res\DMZipHelper.cpp
PlugIns\Plugin_Expand\inc\Res\DMResZipParam.h
PlugIns\Plugin_Expand\inc\Res\DMResZipHelper.h
PlugIns\Plugin_Expand\src\Res\DMResZipHelper.cpp

zip文件头:
3rdParty\zlib\zconf.h
3rdParty\zlib\zlib.h

下面简单介绍下怎么在exe中使用它们,其实就是把插件的代码移到我们的exe工程中,改下预编译头,再Register下   

      

3.我们把它们拷贝出来,分别把.h文件全部放在Test的inc文件夹下,.cpp文件全部放在Test的src文件夹下,然后点击cmake的Generate按扭自动添加到vs工程中

编译:

>DMZipHelper.cpp
1>..\..\Test\src\DMZipHelper.cpp(1) : warning C4627: '#include "Plugin_ExpandAfx.h"': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMZipHelper.cpp(2) : warning C4627: '#include "DMZipHelper.h"': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMZipHelper.cpp(3) : warning C4627: '#include <zconf.h>': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMZipHelper.cpp(4) : warning C4627: '#include <zlib.h>': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMZipHelper.cpp(842) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source?
1>DMResZipImpl.cpp
1>..\..\Test\src\DMResZipImpl.cpp(1) : warning C4627: '#include "Plugin_ExpandAfx.h"': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMResZipImpl.cpp(2) : warning C4627: '#include "DMResZipImpl.h"': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMResZipImpl.cpp(3) : warning C4627: '#include "DMResZipParam.h"': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMResZipImpl.cpp(551) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source?
1>DMResZipHelper.cpp
1>..\..\Test\src\DMResZipHelper.cpp(1) : warning C4627: '#include "Plugin_ExpandAfx.h"': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMResZipHelper.cpp(2) : warning C4627: '#include "DMResZipHelper.h"': skipped when looking for precompiled header use
1>        Add directive to 'StdAfx.h' or rebuild precompiled header
1>..\..\Test\src\DMResZipHelper.cpp(53) : fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "StdAfx.h"' to your source?
1>Generating Code...

 

  

这种错误,和之前的类似,把Plugin_ExpandAfx.h全部替换成StdAfx.h(预编译头改变了),还有一个错误,未找到zlib.lib

3>LINK : I:\MyTest\Build2008\bin\Debug\Test.exe not found or not built by the last incremental link; performing full link
3>LINK : fatal error LNK1104: cannot open file 'zlib_d.lib'

这个错误,我们打开DM库,编译3rdParty下的zlib,生成zlib_d.lib即可:

2.png

生成的lib位于DM库自身的bin目录下,把生成的zlib_d.lib拷贝到MyTest的bin目录下(如:MyTest\Build2008\bin\Debug\zlib_d.lib),OK,这样就编译成功了

      

4.外置zip加载

在Test.cpp中加入注册并加载zip打包资源的代码,类似于DM库的PlugIns\Plugin_Expand\src\Plugin_Expand.cpp中的注册:

g_pDMApp->Register(DMRegHelperT<DMResZipImpl>(),true);
g_pDMApp->SetDefRegObj(DMResZipImpl::GetClassName(),DMResZipImpl::GetClassType());// 把zip打包设置为默认
DMResZipParam zipres(L"MyRes.zip");
theApp.LoadResPack((WPARAM)(&zipres),NULL,NULL);

或者

g_pDMApp->Register(DMRegHelperT<DMResZipImpl>(),true);
DMResZipParam zipres(L"MyRes.zip");
theApp.LoadResPack((WPARAM)(&zipres),NULL,L"DMResZipImpl");// 未设置默认,就在这里强制传入DMResZipImpl字符串

    

5.把MyRes的内容打包成zip,注意,zip包不要带上MyRes这个文件夹,放在bin目录下,运行:

1.gif

     

6.内置zip加载

把我们生成的MyRes.zip放在Test\inc\目录下,新建一个ZIP类型的资源包,资源名就叫IDR_ZIP1

18.gif

   

这时我们注意到,生成的resource.hTest.rc是位于bin目录的,我们把它们移到Test\inc目录下,并修改MyTest\Test\CMakeLists.txt(让它自动加入.rc文件)

# CMAKE_CURRENT_SOURCE_DIR宏指当前CMakeLists.txt所在的目录,即Test文件夹目录
FILE(GLOB ROOT_HEADER 		${CMAKE_CURRENT_SOURCE_DIR}/inc/*.h;${CMAKE_CURRENT_SOURCE_DIR}/inc/*.rc)# 把Test\inc\*.h 设置为ROOT_HEADER标识宏

在Test.cpp中加入注册并加载zip打包资源的代码

g_pDMApp->Register(DMRegHelperT<DMResZipImpl>(),true);					// 注册zip打包Res
	g_pDMApp->SetDefRegObj(DMResZipImpl::GetClassName(),DMResZipImpl::GetClassType());// 把zip打包设置为默认
	//DMResZipParam zipres(L"MyRes.zip");
	DMResZipParam zipres(hInstance,MAKEINTRESOURCE(IDR_ZIP1),L"ZIP");
	theApp.LoadResPack((WPARAM)(&zipres),NULL,NULL);
	//theApp.LoadResPack((WPARAM)(L"MyRes"),NULL,NULL);						// 路径总是相对于生成目录

特别注意,第二个参数要使用MAKEINTRESOURCE这个宏

      

这时,内置zip资源包的单独exe生成了

19.gif

当然,如果你更小心点的话,可以把Test.rc以文本方式打开,把其中的MyRes.zip路径改成相对路径:

IDR_ZIP1                ZIP                     ".\\inc\\MyRes.zip"

      

    下一节教程:REDM基础教程15-增加托盘功能


    

      





文章作者:hgy413
本文地址:http://hgy413.com/3830.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!

本文目前尚无任何评论.

发表评论