22
Sep
September 22, 2012 分类: ASM/C/C++     作者: hoverlees     留言: 93

浏览器嵌入窗口程序一直以来就是WEB应用程序的首选方案,这种方案只需要实现一个主窗口,并提供一些接口供脚本调用,内部的界面和逻辑处理全部用html,css,javascript去实现。我最早看到的相关应用是四五年前的新浪聊天室。我本人在后来的一些项目中也多次用到这种基于IE内核的实现方式。

随着HTML5的强大,嵌入浏览器方式比嵌入Shockwave Flash的方式更应该作为首选方案。本文介绍嵌入IE,Chrome,Firefox三种方式。

本文链接: http://www.hoverlees.com/blog/?p=1339

1.嵌入IE浏览器

嵌入IE内核应该是早期最常用的方法,使用windows平台上的ActiveX方式,将IWebBrowser2对象嵌入到窗口中,IWebBrowser2接口涉及到很多的接口,可以让我们进行事件处理、操作DOM、与JS通信,使用一个连接点接口与浏览器内部连接,获取和处理事件。

使用IE内核有一个缺点就是用户的操作系统各种各样,内核也是多个版本而且不兼容(只有IE9+才支持HTML5)。导致程序非常不稳定,再有就是不能跨平台。以至于现在嵌入IE应该是最差的方式了。

2.嵌入Firefox

Mozilla的XULRunner是一个跨平台的浏览器应用框架,被Mozilla用于Firefox和ThunderBird等软件的核心,同样是开源和支持HTML5,项目使用XPCOM方式实现,除了XPCOM对象(windows系统的在xpcom.dll中)的获取外,其它属性,对象和函数的访问均与MDN上Javascript的文档相同,可谓文档齐全。同样也有已经实现的第三方C++项目将基于XULRunner的浏览器封装成控件,非常方便使用。

MDN地址:https://developer.mozilla.org/en-US/docs/XULRunner

3.嵌入Chrome

Embedding Chrome:经过本人的研究,个人认为嵌入Chrome是最好的解决方案,Chrome本身开源,高效的v8引擎。同时也有很多附属的开源项目,libcef就是其中一个,cef是chrome embed framework的缩写,意在实现chrome嵌入应用程序,本人对这个项目下载下来后进行过测试,效果非常好,支持HTML5,同时跨平台。

项目地址:http://code.google.com/p/chromiumembedded/

下面是libcef调用的示例程序,给大家做参考。


查看详细内容 »

标签: ,
08
Mar
March 8, 2012 分类: ASM/C/C++     作者: hoverlees     留言: 发表

由于经常需要这样一些场合,让应用程序能够响应简单的HTTP请求,以实现一些功能,所以就做了一个这样的小型HTTP服务器库。库使用C++实现,编译成MT,Release模式的静态链接库,欢迎有兴趣的朋友使用。该库仅适用Windows操作系统。

下面是库的定义:

#ifndef __HOVERLEES_TINY_HTTPD_H
#define __HOVERLEES_TINY_HTTPD_H

#include <Windows.h>
#include <WinSock.h>
#include <map>

struct HoverCompare{
	bool operator()(const char* x, const char* y){
		return strcmp(x,y)<0;
	}
};
/**
 * @name 嵌入应用程序的简单HTTP服务器
 * @author Hoverlees http://www.hoverlees.com
 * 调用者继承这个类以处理HTTP请求
 */
class TinyHttpd{
private:
	static bool inited;
	static WSADATA wsaData;
	static DWORD WINAPI ServerThreadProc(void* lpParameter);
	static DWORD WINAPI ClientThreadProc(void* lpParameter);
protected:
	const static int STATUS_IDLE=0;
	const static int STATUS_RUNNING=1;
	typedef std::map<char*,char*,HoverCompare> hmap;
	int status;
	SOCKET serverSocket;
	sockaddr_in address;
public:
	TinyHttpd();
	/**
	 * 启动服务器
	 * @param bindPort 梆定的HTTP端口
	 * @param bindIP 梆定IP地址
	 * @return 成功状态
	 */
	bool startServer(unsigned short bindPor=80,const char* bindIP="0.0.0.0");
	/**
	 * 停止服务器
	 * @return 成功状态
	 */
	bool stopServer();
	/**
	 * 向客户端发送应答,每一个请求只能调用一次这个函数。
	 * @param clientSocket 客户端socket
	 * @param mem 应答的内容
	 * @param memSize 应答内容大小
	 * @param response_headers HTTP响应头,如果不设置,可以为NULL
	 * @return 操作结果
	 */
	bool sendResponse(SOCKET clientSocket,const char* mem,int memSize,hmap* response_headers);
	/**
	 * 回调方法,当服务器收到HTTP请求时,调用这个函数,注意TinyHttpd只支持GET请求
	 * @param clientSocket客户端socket,一般不直接操作,而是传入到sendResponse中。
	 * @param uri 请求uri,如客户端请求 /hoverlees?a=1&b=2 时,uri是 /hoverlees
	 * @param params 请求参数,这是HTTP get参数key=>value的map对象.如 params["a"]=1
	 * @return 如果用户处理了该请求,返回true,这时服务器响应200,如果没处理请求返回false ,服务器响应404
	 */
	virtual bool onHttpRequest(SOCKET clientSocket,const char* uri,hmap* params){return false;}
};

#endif

使用示例如下:

查看详细内容 »

快速链接
推荐标签
最新图片
较新文章
随机推荐
友情链接