[Sciter系列] MFC下的Sciter–4.HTML与图片资源内置

时间:2021-10-05 12:23:21

[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页面和图像资源如何处理才可以呢?

如图所示:

[Sciter系列] MFC下的Sciter–4.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文件夹下。

 

此时,将整个工程从新编译,一个资源内置的程序就写好了!

[Sciter系列] MFC下的Sciter–4.HTML与图片资源内置

 

如果项目文件较多情况下,生成的文件会很大,此时使用upx压缩一下,加密和体积都会很好的得到控制,perfect!

-----

工程代码:

http://pan.baidu.com/s/1EGGAk

 

博客:

CSDN:http://blog.csdn.net/bbdxf

cnBlogs: http://www.cnblogs.com/bbdxf