[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
[Sciter系列] MFC下的Sciter–4.HTML与图片资源内置的更多相关文章
- [Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究
[Sciter系列] MFC下的Sciter–5.Sciter中GUI线程研究,目前MFC存在问题,win32没问题. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的Sc ...
- [Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互
[Sciter系列] MFC下的Sciter–3.Sciter脚本与底层交互,脚本调用底层自定义的方法函数. 本系列文章的目的就是一步步构建出一个功能可用,接口基本完善的基于MFC框架的SciterF ...
- [Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,语法
[Sciter系列] MFC下的Sciter–2.Sciter中的事件,tiscript,CSS部分自觉学习,重点说明Tiscript部分的常见语法和事件用法. 本系列文章的目的就是一步步构建出一个功 ...
- [Sciter系列] MFC下的Sciter–1.创建工程框架
Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大多数 ...
- [Sciter系列] MFC下的Sciter–1.创建工程框架
Sciter SDK中提供的Win32下例程很多,唯独使用很多(对我个人而言)的MFC框架下Sciter程序的构建讲的很少,虽然MFC有这样那样的诟病,但是不可否认的是编写一般的小项目,这仍然是大 ...
- Win7下的内置FTP组件的设置详解
在局域网中共享文件,FTP是比较方便的方案之一.Win7内部集成了FTP,只是设置起来颇费一番功夫.着文以记之. 一.安装FTP组件 由于Win7默认没有安装FTP组件.故FTP的设置第一步就是安装F ...
- MFC下OpenGL入门(可以用)
MFC下OpenGL入门 源文件 1, 建一工程文件,我这里命名为first,现在first工程里面我们没有添加任何东西,所有的东西都是MFC自动帮我们创建的. 2, 添加链接库.这一步很关键.打开菜 ...
- MFC下调用控制台和控制台下MFC库的支持
1.MFC下调用控制台 在CWinApp的InitInstance中对话框的DoModal之前加入 AllocConsole(); // 开辟控制台 SetConsoleTitle(_T(" ...
- MFC下的各种字符串类型和相互转换
MFC下的常用字符串数据类型表示的含义: L:Long 长 P:Point 指针 C:Const 常量 W:Wchar_t 宽字符 T:TCHAR STR:String 字符串 在看看MF ...
随机推荐
- 运用 DataContractSerializer 存储本地对象
public void Save(string filename,State state) { DataContractSerializer ds = new DataContractSerializ ...
- 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 ...
- Unity3D Log 收集机制
最近做项目的时候发现,需要有一个完整的log机制.这样不仅方便调试而且方便观察. 一.需求 目前我认为一个完善的log机制应该是这样的. 一.双击定位 二.生命周期是全局的 三.输出包括consloe ...
- How does database indexing work?
When data is stored on disk based storage devices, it is stored as blocks of data. These blocks are ...
- 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 ...
- Mysql 1030 Got error -1 from storage engine 错误解决
检查你的my.cnf或my.ini,里面会有一个参数innodb_force_recovery,你看看他的值,默认是没有这个参数,没有的话,他的默认值是0,这个参数的值如果大于0,innodb会被禁止 ...
- Secret and Whisper
这两个应用都是以匿名方式向朋友分享信息. 36氪的网友评论到: Whisper 的厉害之处在于给年轻人提供了一个释放压力的地方,比如说他去年陪孩子看病,这种经历不愿意放到 Facebook 上,但是他 ...
- lintcode:Binary Search 二分查找
题目: 二分查找 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. 样例 ...
- Java Project和Web Project 区别
java project是java工程,不包括JSP等前台页面的代码 大部分是CS结构的工程和一些jar包 web project是web工程,是BS结构的系统 web project部署到服务器上 ...
- Ado.Net小练习03(省市联动)
前台界面: 后台代码: namespace _04省市联动 { public partial class Form1 : Form { public ...