gcc/g++命令参数
作者:admin 日期:2013-09-19
gcc/g++ 命令的常用选项
-o FILE && 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果FILE没有指定,缺省文件名是a.out.
-IDIRECTORY && 指定额外的头文件搜索路径DIRECTORY。
个人使用:
使用gcc生成可执行文件后使用 ./filename执行
在MFC中实现CHtmlView与Javascript交互最简单的方法
作者:admin 日期:2013-09-14
想要在Javascript中调用C++的方法,只要实现CHtmlView的OnGetExternal方法就可以,OnGetExternal要返回一个IDispatch的指针。关于如何实现取得这个IDispatch我研究了几天,甚至把那本《Com技术内幕》都看了一遍。
我最开始尝试的方法是直接实现一个直接继承于IDispatch的类,实现它的GetIDsOfNames和Invoke等等。不知道这是不是一个最原始的方法了,虽然可以实现,但是实现的过程非常的繁琐,而且在实现Invoke的时候还要处理各种类型的变量问题。
后来尝试的是再建立一个新的atl工程,然后实现一个标准的COM组件,最后在MFC中用标准的COM组件的调用方式来取得一个接口的IDispatch指针。虽然相对上面的这个方法,在需要写的代码量上已经减少了很多了,但要生成一个dll。
最后在网上发现了一个方法,应该算算得上是最简单的方法了吧。通过CCmdTarget实现自动化服务器。
Tags: javascript MFC
CHtmlView中添加NewWindow3
作者:admin 日期:2013-09-07
头文件的中
.h
public:
DECLARE_EVENTSINK_MAP()
void NewWindow3(
IDispatch **ppDisp,
VARIANT_BOOL *Cancel,
DWORD dwFlags,
BSTR bstrUrlContext,
BSTR bstrUrl
) ;
.cpp
#include <exdisp.h>
#include <exdispid.h>
#include <Mshtml.h>
#include <Mshtmdid.h>
#include <shobjidl.h>
BEGIN_EVENTSINK_MAP(CHtmlInExeView, CHtmlView)
ON_EVENT(CHtmlInExeView, AFX_IDW_PANE_FIRST,DISPID_NEWWINDOW3,NewWindow3,VTS_PDISPATCH VTS_PBOOL VTS_I4 VTS_BSTR VTS_BSTR)
//或者
//ON_EVENT(CCometWebBrowser, AFX_IDW_PANE_FIRST,273,NewWindow3,VTS_PDISPATCH VTS_PBOOL VTS_I4 VTS_BSTR VTS_BSTR)
//273 就是DISPID_NEWWINDOW3
END_EVENTSINK_MAP()
void CHtmlInExeView::NewWindow3(IDispatch **ppDisp,
VARIANT_BOOL *Cancel,
DWORD dwFlags,
BSTR bstrUrlContext,
BSTR bstrUrl
)
{
MessageBox(_T("拦截测试"),_T("提示"),MB_OK);
}
全杭州最划算的企业网站建设——蓝韵网络
作者:admin 日期:2013-08-31
go下载
作者:admin 日期:2013-08-27
人人都能用的10条网站易用性技巧
作者:admin 日期:2013-08-23
GCC 命令行详解
作者:admin 日期:2013-08-21
下载chrome代码并编译
作者:admin 日期:2013-08-21
sed命令详解
作者:admin 日期:2013-08-21
sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
Linux环境变量配置文件
作者:admin 日期:2013-08-12
Js异步协作
作者:admin 日期:2013-08-06
文档 http://html5ify.com/eventproxy/api.html
先上上段代码
var EventProxy = require("./eventproxy'); var proxy = new EventProxy(); var add= function (v1, v2, v3){ console.log(v1+v2+v3+''); }; proxy.assign("v1", "v2", "v3", add); clinet1.get("key1", function (err, data) { //do something proxy.trigger("v1", data); }); clinet2.get("data", function (err, data) { //do something proxy.trigger("v2", data); }); clinet3.get("l10n", function (err, data) { //do something proxy.trigger("v3", data); });
在JS的编程中经常会有这样的需要: 需要生成一个页面,数据是ajax的,模板也是ajax获取,通常的做法是先发一个ajax请求取数据,等永请求完成再发一个ajax请求取模板,最后再来渲染。
实际上请求数据和请求模板这两个请求同时发起,等两个都返回的时候就可以渲染了。这个eventproxy就是为方便这样做事而写的一个东西。
javascript 函数嵌套调用的效率测试
作者:admin 日期:2013-07-31
Javascript中函数嵌套定义给我们开发带来了很多便利,但是他的效率怎么样呢? 我做了一个简单的测试。
//test function func1(a, b) { return (function(a, b){ return (function(a, b){return a+b})(); })(); } function func2(a, b) { var nest1 = function(a, b) { var nest11 = function(){ return a+b; } return nest11(a+b); } return nest1(a,b); } function func3(a, b) { function nest1(a, b){ function nest11(a, b){ return a+b; } return nest11(a, b); } return nest1(a, b); } function nest44(a, b){ return a+b; } function nest4(a, b){ return nest44(a, b); } function func4(a, b) { return nest4(a, b); } console.time("start1"); for(var i=0; i<1000000; i++) { func1(1,1); } console.timeEnd("start1"); console.time("start2"); for(var i=0; i<1000000; i++) { func2(1,1); } console.timeEnd("start2"); console.time("start3"); for(var i=0; i<1000000; i++) { func3(1,1); } console.timeEnd("start3"); console.time("start4"); for(var i=0; i<1000000; i++) { func4(1,1); } console.timeEnd("start4");
本代码用nodejs看执行,得到如下的结果:
# node test2.js
start1: 190ms
npm常用命令
作者:admin 日期:2013-07-31
npm install <name>安装nodejs的依赖包
例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install express@3.0.6
npm install <name> -g 将包安装到全局环境中
但是代码中,直接通过require()的方式是没有办法调用全局安装的包的。全局的安装是供命令行使用的,就好像全局安装了vmarket后,就可以在命令行中直接运行vm命令
npm install <name> --save 安装的同时,将信息写入package.json中
项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包
这样代码提交到github时,就不用提交node_modules这个文件夹了。
npm init 会引导你创建一个package.json文件,包括名称、版本、作者这些信息等
npm remove <name>移除
npm update <name>更新
npm ls 列出当前安装的了所有包
npm root 查看当前包的安装路径
npm root -g 查看全局的包的安装路径
npm help 帮助,如果要单独查看install命令的帮助,可以使用的npm help install
Sublime Text2.0.2破解
作者:admin 日期:2013-07-24
PHPCMS乱解读之 pc标签的实现
作者:admin 日期:2013-07-31
标 题: PHPCMS乱解读之 pc标签的实现
作 者: web开发网[http://www.zeroplace.cn]
时 间: 2013/07/31 12:15:00
链 接: http://www.zeroplace.cn/article.asp?id=855
说 明: 转载请保留本段文字
最近电脑硬件出了点问题,现正在修理中呀,敢问各位有没有会修主板那种电路的...
前面在写 PHPCMSV9 乱解读 之 PHPCMS V9的MVC 的时候有写到phpcms模板解析引擎的部分,但只是解释了一下模板是怎么编译的,没有具体讲其中的每个标签的实现细节。实际上多数的标签都很常规,并没有什么好说的。这里我来写写PC这个标签的实现方法。
首先还是看到libs/classes/template_cache.class.php这个文件中template_parse这个方法,发现里面有一句代码是用来编译pc这个标签的
$str = preg_replace("/\{pc:(\w+)\s+([^}]+)\}/ie", "self::pc_tag("$1','$2', '$0')", $str);
Tags: phpcms
PHPCMS乱解读之phpcmsv9中的缓存
作者:admin 日期:2013-07-09
在 PHPCMSV9 乱解读 之 PHPCMS V9的MVC 这篇文章中有看到一组global.func.php中的函数,但是那时候没有细讲。
/** * 写入缓存,默认为文件缓存,不加载缓存配置。 * @param $name 缓存名称 * @param $data 缓存数据 * @param $filepath 数据路径(模块名称) caches/cache_$filepath/ * @param $type 缓存类型[file,memcache,apc] * @param $config 配置名称 * @param $timeout 过期时间 */ function setcache($name, $data, $filepath="', $type='file', $config='', $timeout=0) { pc_base::load_sys_class('cache_factory','',0); if($config) { $cacheconfig = pc_base::load_config('cache'); $cache = cache_factory::get_instance($cacheconfig)->get_cache($config); } else { $cache = cache_factory::get_instance()->get_cache($type); } return $cache->set($name, $data, $timeout, '', $filepath); } /** * 读取缓存,默认为文件缓存,不加载缓存配置。 * @param string $name 缓存名称 * @param $filepath 数据路径(模块名称) caches/cache_$filepath/ * @param string $config 配置名称 */ function getcache($name, $filepath='', $type='file', $config='') { pc_base::load_sys_class('cache_factory','',0); if($config) { $cacheconfig = pc_base::load_config('cache'); $cache = cache_factory::get_instance($cacheconfig)->get_cache($config); } else { $cache = cache_factory::get_instance()->get_cache($type); } return $cache->get($name, '', '', $filepath); }
PHPCMSV9 乱解读 之 PHPCMS V9的MVC
作者:admin 日期:2013-07-07
nginx location 不详解
作者:admin 日期:2013-06-06
针对JS对象数组的Array排序实现
作者:admin 日期:2013-06-06
这里只实现了冒泡排序和快速排序,一般来说也够用了
/* * 对Array进行排序 */ var CMPMETHOD = { btTimeCmp: function(a, b) { a=a.replace("天", ""); b=b.replace("天", ""); var as = a.split("年"); var bs = b.split("年"); var ayear = as.length > 1 ? as[0] : 0; var aday = as.length > 1 ? as[1] : parseInt(as[0]); var byear = bs.length > 1 ? bs[0] : 0; var bday = bs.length > 1 ? bs[1] : parseInt(bs[0]); var va = ayear * 365 + parseInt(aday); var vb = byear * 365 + parseInt(bday); if (va > vb ) return 1; if (va < vb ) return -1; if (va == vb) return 0; }, numberCmp: function(a, b) { a = parseFloat(a); b = parseFloat(b); return CMPMETHOD.commonCmp(a, b); }, commonCmp: function(a, b){ if (a < b) return -1; if (a == b) return 0; if (a > b) return 1; } } Array.prototype.swap = function(i, j) { var temp = this[i]; this[i] = this[j]; this[j] = temp; } Array.prototype.quickSort = function() { var s=null, e=null, k=null, cmp=CMPMETHOD.commonCmp; if (arguments.length == 1) { s = null; e = null; k =arguments[0]; } if (arguments.length == 2 ) { s = arguments[0]; e = arguments[1]; } if (arguments.length == 3) { s = arguments[0]; e = arguments[1]; k = arguments[2]; } if (arguments.length == 4) { s = arguments[0]; e = arguments[1]; k = arguments[2]; cmp = arguments[3]; } if (s == null ) s = 0; if (e == null ) e = this.length-1; if (s >= e) return ; var x = s; //基准索引 var i, j; i = s; j = e; while(j > i) { for(; j>i; j--) { if (cmp(this[j][k], this[x][k]) < 0) { this.swap(j, x); x = j; break; } } for(; i