| UTunnels's profile地道联盟臭蛋军BlogLists | Help |
|
地道联盟臭蛋军=SMA= 8/24/2006 98年的老程序啊去msdn查找script相关的信息,找到一个很老的脚本范例,编译成dll文件可以在ie里面调用。
我把其中的Interpreter单独拿出来做了个通用的脚本解析程序。
语法是仿照c的,不过有不少缺陷和bug,orz,本来以为拿来就能用了,sample毕竟是sample……
首先是编译的问题,iostream.h在vc7里面已经没有了,改为iostream,并且用std命名空间。
再就是脚本解析上的bug:
·用了static的变量来储存递归调用中的计数,递归结束了居然忘记把变量复位……
·解析Instruction的时候,循环里面list++了,但是里面某个函数调用又给++了一次,
还有些缺陷:
·不支持数组(无语,现在写程序里如果没有数组……)
·不能解析%取模运算(好说,加上个操作就是了)
·不能解析 += /= *= %=操作(罢了,不用也不是不行)
·没有指针类型(算了,脚本也不必这么高级)
·貌似忘记回收内存?
修改了一通,加上CFunctionLibrary类来添加一些系统函数,貌似可以用这个来构建一个替代数组的方法。
例如Array(怎么写到后来跟js学了……) 7/19/2006 传统观念颠覆了JavaScript里面定义一个数组居然写
var a = [];( =new Array()也一样的)
本来早已经习惯了{}来初始化一个数组,结果js里面这么写
var a = {};
实际上是定义了一个Map(或者说Hashtable之类的)
Map里面取值/赋值也是用索引例如
a["keyname"]="12121";
a["keyname"]=[1,2,3,232,5,];
这点又像c#
Array居然有push和pop方法,唉,真是四不像的东西。 5/28/2006 汉化老是出现灵异现象,原来……老是有莫名其妙的个别字符错误,查对导入的数据又是对的。
今天忽然发现“让一让”中的前一个“让”居然变成“怎”了,对照原文发现那个位置可以被2048整除……
于是检查其他出问题的地方,无一例外都是2048的倍数~~~
看来是写ppf的时候每隔2048就少写1个字节。。。 2/12/2006 太神奇了-,-,猜猜结果class A
{
private:
LPSTR sa;
public:
A(){sa="aaa";}
void afunc()
{
MessageBox(NULL,sa,"this is A::afunc",MB_OK);
}
};
/*B继承A*/
class B:public A
{
private:
LPSTR sb;
public:
B():A(){sb="bbb";}
void bfunc()
{
MessageBox(NULL,sb,"this is B::bfunc",MB_OK);
}
};
/*C继承A*/
class C:public A
{
private:
LPSTR sc;
public:
C():A(){sc="ccc";}
void cfunc()
{
MessageBox(NULL,sc,"this is C::cfunc",MB_OK);
}
};
typedef void (A::*LPDELEGATEAFUNC)(void);
/*WinMain*/
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR CmdLine,int CmdShow)
{/*实例化B和C*/ B* b=new B(); C* c=new C(); /*A成员函数指针指向B的成员函数*/ LPDELEGATEAFUNC pf=(LPDELEGATEAFUNC)B::bfunc; /*用C的实例调用该函数*/ (c->*pf)(); }/*WinMain*/ 2/10/2006 用VC++的try/catch玩一个花招-.-这几天自己写个Container类,用在d3d绘图环境下实现窗口/按钮类似的功能,开始的架构很单纯,用一个static的链表来存放所有的底层Container句柄,用一个链表存放下一级Container(Children)句柄,用一个Container*存放上一级Container(Parent)句柄,除了写好相应的Add, Remove方法以外,再用virtual方法写鼠标和键盘响应函数(OnMouseDown, OnMouseMove, OnKeyDown, OnKeyUp...),假如需要写按钮,就继承Container类,写好按钮的功能,重写那些键盘和鼠标响应函数。
经过一段时间,程序初具规模,但是发现了一系列问题,绘图的问题暂且按下不表,单是那些virtual方法来实现键盘鼠标功能就很成问题:覆盖问题。要实现新功能同时保留基类的功能确实比较麻烦。于是我想到java和.net的实现方式:用一个列表存放这些响应方法,触发事件的时候执行列表里面的所有方法。于是:重写……
当然一开始想到函数指针了,用链表存放这些函数指针,然后逐一调用。开始写了,添加n多链表来存放不同事件的响应函数指针,但是写到一半了,忽然想到这些方法可能会是成员函数,但是成员函数指针和普通函数指针是不能转换的,甚至不能把void*转换成成员函数指针,也就是说原来写的那个链表类(用void*保存指针)根本不能存放成员函数指针……
C#的delegate是个好东西,无论是成员函数还是static函数都一视同仁,但是对于C++来说就要命了,两者不能转换(编译器这关都混不过去)。。。。
最后想到了union-_,-,把成员函数指针和函数指针都放进去,然后用try/catch来耍个花招:
try
{
转换成函数指针调用
}
catch(...)
{
try
{
转换成成员函数指针调用
}
catch(...){}
}
编译通过,正高兴呢,运行,出错……
错误居然在一个不相干的位置,看来是try/catch引起不良反应了。。。想了半天没有结果,后来随手把两个try模块交换了一下位置,结果没错误了……诡异…………虽然不明白原理,暂且喘口气。
|
||||
|
|