[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!

-----

工程代码:

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

 

博客:

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

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

[Sciter系列] MFC下的Sciter–4.HTML与图片资源内置的更多相关文章

  1. [Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究

    [Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究,目前MFC存在问题,win32没问题. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的Sc ...

  2. [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互

    [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...

  3. [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,语法

    [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,CSS部分自觉学习,重点说明Tiscript部分的常见语法和事件用法. 本系列文章的目的就是一步步构建出一个功 ...

  4. [Sciter系列] MFC下的Sciter–1.创建工程框架

    Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大多数 ...

  5. [Sciter系列] MFC下的Sciter–1.创建工程框架

      Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大 ...

  6. Win7下的内置FTP组件的设置详解

    在局域网中共享文件,FTP是比较方便的方案之一.Win7内部集成了FTP,只是设置起来颇费一番功夫.着文以记之. 一.安装FTP组件 由于Win7默认没有安装FTP组件.故FTP的设置第一步就是安装F ...

  7. MFC下OpenGL入门(可以用)

    MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...

  8. MFC下调用控制台和控制台下MFC库的支持

    1.MFC下调用控制台 在CWinApp的InitInstance中对话框的DoModal之前加入 AllocConsole(); // 开辟控制台 SetConsoleTitle(_T(" ...

  9. MFC下的各种字符串类型和相互转换

    MFC下的常用字符串数据类型表示的含义: L:Long  长 P:Point  指针 C:Const  常量 W:Wchar_t  宽字符 T:TCHAR  STR:String  字符串 在看看MF ...

随机推荐

  1. 运用 DataContractSerializer 存储本地对象

    public void Save(string filename,State state) { DataContractSerializer ds = new DataContractSerializ ...

  2. Why am I able to change the contents of const char *ptr?

    http://stackoverflow.com/questions/3228664/why-am-i-able-to-change-the-contents-of-const-char-ptr I ...

  3. Unity3D Log 收集机制

    最近做项目的时候发现,需要有一个完整的log机制.这样不仅方便调试而且方便观察. 一.需求 目前我认为一个完善的log机制应该是这样的. 一.双击定位 二.生命周期是全局的 三.输出包括consloe ...

  4. How does database indexing work?

    When data is stored on disk based storage devices, it is stored as blocks of data. These blocks are ...

  5. poj 3358 Period of an Infinite Binary Expansion

    由乘2取整得到分数的小数位,可以找到规律!!! 例如:1/10,2/10,4/10,8/10,16/10,32/10,64/10…… 取整后:1/10,2/10,4/10,8/10,6/10,2/10 ...

  6. Mysql 1030 Got error -1 from storage engine 错误解决

    检查你的my.cnf或my.ini,里面会有一个参数innodb_force_recovery,你看看他的值,默认是没有这个参数,没有的话,他的默认值是0,这个参数的值如果大于0,innodb会被禁止 ...

  7. Secret and Whisper

    这两个应用都是以匿名方式向朋友分享信息. 36氪的网友评论到: Whisper 的厉害之处在于给年轻人提供了一个释放压力的地方,比如说他去年陪孩子看病,这种经历不愿意放到 Facebook 上,但是他 ...

  8. lintcode:Binary Search 二分查找

    题目: 二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 ...

  9. Java Project和Web Project 区别

    java project是java工程,不包括JSP等前台页面的代码 大部分是CS结构的工程和一些jar包 web project是web工程,是BS结构的系统 web project部署到服务器上 ...

  10. Ado.Net小练习03(省市联动)

    前台界面:          后台代码: namespace _04省市联动 {     public partial class Form1 : Form     {         public ...