SilkTest高级进阶系列5-奇怪的Tag

有的时候,我们通过Record菜单下面的Window Declarations, Window Identifiers和Window Tags记录或者识别出来的控件tag中包含着奇怪的对象类型,像是下面这样的:

[-] CustomWin Toolbox
[+] msw multitag “[AfxControlBar42u]Toolbox”
[ ] “[AfxControlBar42u]$59420”
[-] CustomWin Toolbox
[+] msw multitag “[AfxWnd42u]Toolbox”
[ ] “[AfxWnd42u]$103”
[-] CustomWin AfxOleControl42u1
[ ] msw tag “[AfxOleControl42u]$0”
[-] CustomWin TemplateViewer
[+] msw multitag “[AfxWnd42u]Display”
[ ] “[AfxWnd42u]$103”
[-] CustomWin Afx160000081
[ ] msw tag “[Afx:1*:8]$59648”
[-] CustomWin Afx160000081
[ ] msw tag “[Afx:1*:8]$59952”
[-] CustomWin Afx1600000010011601
[ ] msw tag “[Afx:1*:0:10011:6:0]$101”
[-] ListView ListView1
[ ] tag “$0”

我们认识ListView,pushbutton等常见的控件类型,但是 AfxControlBar42u和Afx:1*:8到底是什么呢?
其实他们也是Windows对象类型,其中Windows有几个基本类,他们的含义如下:
AfxWnd 表示子窗口
AfxFrameOrView表示边框窗口(SDI主窗口或MDI子窗口)或视图
AfxMDIFrame表示MDI主窗口
AfxControlBar表示标准控制条
AfxOleControl表示OLE控件(OLE: Object Linking and Embedding,对象连接与嵌入)

而形如Afx:1*:8的窗口,其实是一些动态产生的窗口,这些窗口是由Windows程序在初始化的时候调用AfxRegisterWndClass注册的。
其中,AfxRegisterWndClass函数是MFC全局函数, AfxRegisterWndClass的函数原型:
LPCTSTR AFXAPI AfxRegisterWndClass(UINT nClassStyle,
HCURSOR hCursor, HBRUSH hbrBackground, HICON hIcon)
参数1指定窗口类风格;
参数2、3、4分别指定该窗口类使用的光标、背景刷、像标的句柄,缺省值是0。
此函数根据窗口类属性动态地产生窗口类的名字,然后,判断是否该类已经注册,是则返回窗口类名;否则用指定窗口类的属性(窗口过程指定为缺省窗口过程),调用AfxRegisterCalss注册窗口类,返回类名。
这些动态产生的窗口类名字由以下几部分组成(包括冒号分隔符):
如果参数2、3、4全部为NULL,则由三部分组成。
“Afx”+“:”+模块实例句柄”+“:”+“窗口类风格”
否则,由六部分组成:
“Afx”+“:”+模块实例句柄+“:”+“窗口类风格”+“:”+光标句柄+“:”+背景刷句柄+“:”+像标句柄。比如:“Afx:400000:b:13de:6:32cf”。
一般AfxRegisterWndClass函数在MFC注册主边框或者文档边框“窗口类”时会被调用。

所以,下次见到这些吓人的tag的时候不要惊讶,他们只是一些Windows窗口类型而已。

Leave a comment

请输入正确的验证码