[Sciter系列] MFC下的Sciter–4.HTML与图片资源内置
[Sciter系列] MFC下的Sciter–4.HTML与图片资源内置,防止代码泄露。
本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterFrame程序,以此作为以后程序的基础。其中,文章中按照如下逻辑编排(解决如下问题):
1、使用什么环境
2、完成什么功能
3、如何完成
1、工程环境: VS2010 + Sciter-SDK + Win7
建议:HTML页面还使用ANSI编码,UTF-8此时不建议使用。
2、本文完成的功能:将上节课的HTML页面和相关图片资源内置,防止代码泄露。
3、具体步骤如下:
由于HTML页面随意就可以打开,并且代码加密不太现实,最简单的方法就是将资源内置,这样即美观又为以后的程序加密打下基础。
首先,我们来研究一般的VC++资源内置办法:(具体的自行搜索)
访问时使用Res://协议,按照Res://应用程序.exe/[类型/]资源ID或名称。这是微软提供的在C++内部访问内置资源的方法,似乎我们只需要将所有的资源放入Res中,然后将路径都改为Res协议的路径就可以了!但是,现实很残酷,经多次测试,这是不可行的。
换一种思路,我们将资源通过LoadResource()加载,然后释放到内存,最后通过 SciterLoadHtml() 从内存加载就可以了!这种方式的确可以加载HTML页面,但是我们也很容易看出,所有的图片都不能正常显示!难道我们还需要将图片也放到内存中吗?当让,加载到内存很容易,但是难点在于HTML如何加载放在内存中的图片?这一点是我们无法实现的(至少是我无法实现的)。
到了这里,这个问题似乎已经无法解决了!但是,不知有人注意到了没?官方给出的历程都是通过WIn32加载内置资源实现的,包括图片!他是如何解决上述问题的呢?我们下面一一剖析!
首先,官方给出的程序都是Win32下自定义窗口类,实现 event_handle 和 host 接口,然后通过 load_file(res:xxx) 加载内置的资源文件,从来没有对图片进行特别的处理,所以我们如果能找到最低的加载流程,就可以完成资源内置的功能了!
我们注意到,核心函数是 load_file(),但是在MFC下,即便实现了 event_handle 和 host 接口,测试时也无法使用此功能!其实这是有原因的,在host的注释中其实已经有了说明,在我们的窗口类中,必须有
HWND get_hwnd() ;
HINSTANCE get_resource_instance();
这两个函数的实现,host内部需要使用这两个函数。
所以我们必须在窗口类中实现这两个函数:
public: HWND get_hwnd() { return m_hWnd; } HINSTANCE get_resource_instance() { return AfxGetInstanceHandle(); }
然后将第一节加载页面的函数修改为:load_file(res:xxx)的形式。(HTML资源和图片资源的修改放在最后讲解)
此时再次测试,还是不可行,对比Demo程序,最后找到了一个函数 setup_callback(); 注册回调,在加载资源之前注册一下,再次测试,OK !
按照上面的流程,资源已经完成了内置工作。但是HTML页面和图像资源如何处理才可以呢?
如图所示:
RC文件中代码:
INDEX HTML "res\\index.html"
TOOL_1 PNG "res\\tool_1.png"
比较推荐大家导入资源后手工修改RC资源,删除有数字ID的名称和声明。
HTML页面通过 load_file(“res:index.html”); 就可以直接加载。
HTML中的图片通过 res:tool_1.png 就可以直接加载。
注意:html和图片文件必须放在Res文件夹下。
此时,将整个工程从新编译,一个资源内置的程序就写好了!
如果项目文件较多情况下,生成的文件会很大,此时使用upx压缩一下,加密和体积都会很好的得到控制,perfect!
-----
工程代码:
博客:
CSDN:http://blog.csdn.net/bbdxf
cnBlogs: http://www.cnblogs.com/bbdxf
CSDN博客:http://blog.csdn.net/bbdxf
CNBlogs: http://www.cnblogs.com/bbdxf
本博客内容为本人原创,如有转载请保留出处!尊重他人就是尊重自己!