Friday, December 22

brew程序的入口点

一个brew程序的真正入口点在AEEModGen.c里面

#ifdef AEE_LOAD_DLL
__declspec(dllexport) int AEEMod_Load(IShell *pIShell, void *ph, IModule **ppMod)
#else
#if defined(BREW_MODULE) || defined(FLAT_BREW)
extern int module_main(IShell *pIShell, void *ph, IModule **ppMod);
int module_main(IShell *pIShell, void *ph, IModule **ppMod)
#else
int AEEMod_Load(IShell *pIShell, void *ph, IModule **ppMod)
#endif
#endif
{
// Invoke helper function to do the actual loading.
return AEEStaticMod_New(sizeof(AEEMod),pIShell,ph,ppMod,NULL,NULL);
}

可见模拟器通过DLL的公开函数AEEMod_Load进入初始化阶段

brew各个模块之间可以进行消息传递函数回调, 而每个模块都可以单独编译不需要连接lib, 是因为各个模块实际公开的都是函数指针, 类似于
#define ISHELL_SendEvent(p,cls,ec,wp,dw) GET_PVTBL(p,IShell)->SendEvent(p,0,cls,ec,wp, dw)

AEE环境给每一个module都传入IShell指针, 在程序里如果想调用其他模块, 需要首先通过ISHELL_CreateInstance创建一个新的实例。
ISHELL_CreateInstance没有代码可看, 可以猜测AEE通过给出classid, 到自己维护的classid表里找到需要dll(module), 调入内存, 执行公开函数AEEMod_Load做初始化

AEEMod_Load-> AEEStaticMod_New设置modFuncs->CreateInstance = AEEMod_CreateInstance
随后AEE调用这个指针,在AEEMod_CreateInstance里面完成调用AEEClsCreateInstance的任务, classid这时候作为参数传进来
在AEEModGen.h里面有AEEClsCreateInstance函数的声明, 这个函数的定义需要在自己的程序里面完成。
int AEEClsCreateInstance(AEECLSID ClsId, IShell *pIShell, IModule *pMod, void **ppobj);

如果一个module里面定义了多个class就需要判断classid的值,创建不同的实例。

在初始化代码里
if (NULL == (pme = (AEEApplet*)MALLOC(nSize + sizeof(IAppletVtbl))))
return FALSE; //分配空间,nSize代表CAPP的空间大小!!
appFuncs = (IAppletVtbl *)((byte *)pme + nSize);
这两句表明在applet的结构体后面就是IAppletVtbl

appFuncs->AddRef = AEEApplet_AddRef;
appFuncs->Release = AEEApplet_Release;
appFuncs->HandleEvent = AEEApplet_HandleEvent;

在AEEApplet_HandleEvent里面将IApplet指针转换成AEEApplet指针,然后调用AEEApplet的pAppHandleEvent
之所以可以这么转换是因为AEEApplet的第一个成员就是IApplet指针的地址。结构体的第一个成员的地址就是这个结构体的地址。

INIT_VTBL(pme, IApplet, *appFuncs);
这一句使的AEEApplet结构体的第一个成员指向applet结构体后面的IAppletVtbl

Tuesday, December 5

突然想起若干年前某些华人的卑劣

1999年在日本,我第一次搬家。打登载在中文报纸上帮助搬家的人的电话, 电话里的声音听上去很朴实。搬家当天那个人开了一辆面包车来, 一开始并没有说什么。等你家当装在了他的车上, 开车途中, 露出了本像。先套话看你是不是黑户口, 然后用骂骂咧咧的语言, 讲他家开的是风俗店, 差点明说他就是黑社会。让我多交搬家费, 后来当着我一位女同事的面,讲黄色笑话。

2000年陪老婆去参加日语一级考试。校门口,韩国老生摆起桌子提供饮料为韩国学生鼓劲。零散的几个中国妇女往学生手里塞F:L-G的传单。

Friday, December 1

Vista冲击

刚刚看了微软Vista中国发布现场实况。
http://wmv.it168.com/others/06.11.30/Windows.wmv

加上前一段时间ms放出的vista sdk+.net framework 3.0,
http://www.microsoft.com/downloads/details.aspx?FamilyId=C2B1E300-F358-4523-B479-F53D234CDCCF&displaylang=en

我认为vista将迅速普及。这里有两方面的原因
1,面向家庭用户, vista的交互界面对用户的吸引作用,加上硬件的需求很高, 使得intel和dell这样的硬件厂商非常热衷于推广它。推动用户更新电脑就意味着更高的收益。
2,面向企业用户,vista sdk和.net framework 3.0的捆绑对于企业软件提供商有很大吸引。特别是缺少积累的中小软件开发商,因为开发成本降低和用户体验大幅提高, 市场竞争将会更加激烈。

纯技术观点
在vista下运行你的软件, 这个blog显示了可能会存在的一些问题
http://blogs.itecn.net/blogs/winvista/archive/category/1095.aspx

给我印象深刻的是这篇文章
http://blogs.itecn.net/blogs/winvista/archive/2006/09/03/3604.aspx

如果你从一个程序员的角度暂时没有感到冲击,那没什么不正常。因为你还没有面向vista编程。注意vista改变了一些东西,加强了安全性。比如service将处于session 0, GUI将处于session 1, 再比如顶楼blog里提到的"虚拟重定向"。

如果你作为企业类软件的厂商暂时没感到冲击, 那说明你的嗅觉不够敏锐啊。

如果你做为普通用户没有感到冲击, 那说明你非常成熟, 一眼你就看出了新玩意的本质。可难道iPod之前就没有mp3 player吗?