loop_in_codes

低调做技术__欢迎移步我的独立博客 codemaro.com 微博 kevinlynx

玩了一下alienbrain的EventsScript

从我接触的UNIX文化中我知道,要学会更好地去使用工具去组合工具来完成日常的工作。项目使用alienbrain作为源代码管理工具。每次在VC里有些代码文件里总会写些并不想签入到代码服务器上的代码,例如我经常#include "vld.h"来检测内存泄漏。但是真的等到签入代码时,又经常忘记删除这些代码。

 

于是我想,如果每次在我签入代码前,VC或者alienbrain或者其他工具能根据我的设置检查我的代码中是否存在这种不想签入的代码,然后提示我。问了一下向来很熟悉工具的FOX(很抱歉,我甚至不会使用WORD,我真不敢相信我的坦率:D),结果他也不知道。今天闲来无事翻了下alienbrain附带的文档,发现EventsScript。

 

alienbrain里的EventScript总的来说是一种让用户定制更多功能的机制。它定义诸如签入签出获取版本等动作为event,然后用户可以使用alienbrain支持的VBScript和JavaScript脚本来处理这些事件。例如,当你签出一个文件时,ab(alienbrain)会调用你的脚本,让你来处理这一事件)。当脚本返回时,ab继续处理刚才的操作(如果你实在想中止这一动作也可以)。

 

这正是我需要的一种机制。迅速地看完了EventScript这一节的文档。再想想我的需求,大体思路就是:给check in挂个脚本,让该脚本调用一个外部程序,处理将要check in的文件,分析这个文件。我可以规定在我的代码中凡是不想签入的代码都可以附加一个tag,例如:#include "vld.h" //DUMMY,分析该代码文件时,发现代码中有//DUMMY字符串,就提示我说该代码文件有不想被签入的代码,位于某某行。

 

看来我似乎需要一个grep工具,万恶的是windows只有find。不过find基本可以满足我的需求,但是find的输出结果看起来并不是那么友好,并不是可以被另一个程序处理的格式。(linux下通过建立标准的输入输出格式,从而可以轻松地让多个程序协作起来更好地完成很多事)无论如何,我需要使用ab提供给我的接口来试验下我的想法。

 

然后噩梦开始了。先是发现NxNLauncher(ab提供的一个接口,大致是这样拼写的,现在机器上没ab)的Exec接口是异步执行进程,从而StdOut属性及ExitCode总是得不到正确的值。后来一不小心在ab的wiki上看到,说Exec有个隐藏参数,用来标识是同步执行进程还是异步执行,显然,这个隐藏参数undocumented。- -!

 

再然后是每次执行find后,find程序倒是被执行起来了,结果却崩溃了。万恶的是我执行其他程序却很正常。google了一下居然发现没人遇到这个问题。最近我的windows总是崩溃各种程序,visual stdio, word, find。但是,我并不打算自己写个find,即使是简化版的。于是我决定写个findwrapper,让ab来调用我自己写的程序,然后我这个程序调用find。然后为了搞定两个程序的通信,又想起了管道pipe。当然,这里的通信很简单,我只需要让find的输出重定向到我的findwrapper,然后我的findwrapper又会被重定向到ab,然后我的ab脚本就可以捕获这些输出,然后再分析这些输出就可以了。- -!

 

其实,最简单的解决方法,就是我自己写个撇脚的程序,自己去分析要签入的文件是否含有//DYMMY字符串。但是很显然,我更喜欢证明我最初的想法是否正确。

 

然后,在我的findwrapper里,再一次让find崩溃。经过几次试验,显然问题出在共享管道上。find和ping的不同在于,find可以从标准输入里获取输入,而ping只需要一个标准输出(也许还有stderr)。在CreateProcess里传入的startup info结构体里,需要提供标准输入、标准输出、及错误输出三个handle。显然,问题出在标准输入上,我提供了错误的值。按照一般的接口设计,我以为我如果不提供输入句柄,find就会忽略。但是find显然没那么聪明,或者说,find更喜欢直接*ptr = 10而不是if( ptr != 0 ) *ptr = 10。无论如何,当我把输入句柄填为输出句柄后,findwrapper可以捕获find的输出了,当然,find也不崩溃了。

 

我总觉得折腾windows api有点噩梦的感觉。我记得几年前刚学windows编程的时候很多函数总要试验很多次才能得到正确的结果,基本上我要尝试各个参数的诸多组合。这还不包括上下文的影响,你要RegisterClass出了问题,CreateWindow楞是不会给你一点点有意义的error code,OMG。

 

 

 

posted on 2009-02-28 16:48 Kevin Lynx 阅读(2421) 评论(3)  编辑 收藏 引用 所属分类: 像少年啦飞驰通用编程

评论

# re: 玩了一下alienbrain的EventsScript 2009-03-01 11:34 陈梓瀚(vczh)

你可以用宏让你不写某个define的时候就忽略检查代码。  回复  更多评论   

# re: 玩了一下alienbrain的EventsScript 2009-03-01 12:58 abc

的确。正确的是用宏嘛
#ifdef CHECK_MEM
#include "vld.h"
#endif  回复  更多评论   

# re: 玩了一下alienbrain的EventsScript 2009-03-01 13:22 Kevin Lynx

@陈梓瀚(vczh)
这个宏定义在哪里?定义在代码文件里的话肯定不起作用(会把定义的地方也签入),在工程设置里定义会签出工程文件。
  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理