编写可复用性更好的C++代码:Band对象和COMToys(9)
2006-07-21 11:45:59 来源:WEB开发网核心提示: { // protected block of code CTLockData lock(g_mydata);// do your worst……}由于有了智能指针,CTLockData的好处是不必记住解锁,编写可复用性更好的C++代码:Band对象和COMTo
{ // protected block of code
CTLockData lock(g_mydata);
// do your worst
……
}
由于有了智能指针,CTLockData的好处是不必记住解锁,即便函数或代码块有多个出口。C++保证析构函数会被调用并且在控制离开时解锁。CTFactory在任何需要存取其全局类工厂列表时使用CTLockData。
调试诊断
理解任何COM对象运作行为的最佳方法是只要接口方法被调用,就输出其诊断信息。没有这样的诊断,便不可能弄清楚Band对象是如何工作的。COMToys有一个内建的跟踪机制。IMPLEMENT_ IWhatsIt宏在每一个函数的开始处(顶部)产生TRACE语句,所以只要打开跟踪开关(COMToys::bTRACE = TRUE),就可以看到对象正在做什么。COMToys使用CTraceFn类。
COMToys能产生人们可读的接口名。这个诊断系统使用一个叫DbgName的重载函数来获得各种不同对象的"调试名"。DbgName(WM_DESTROY)返回WM_DESTROY;DbgName(SCODE)返回S_OK 或 E_OUTOFMEMORY之类的值;而DbgName(CWnd*)返回窗口名字。
正如所期望的那样,DbgName(REFIID)返回人可读的GUID,如:{EB0FE172-1A3A-11D0-89B3-00A0C90A90AC},但如何知道这一长串东西代表的就是IDeskBand呢?COMToys有一个办法:
DEBUG_BEGIN_INTERFACE_NAMES()
DEBUG_INTERFACE_NAME(IDeskBand)
DEBUG_END_INTERFACE_NAMES()
现在DbgName(IID_IDeskBand)返回的是IDeskBand,而不是那让人费解的十六进制。这个宏产生一个局部表,它被链接到一个DbgName可以搜索的全局表中。详细内容请参见源代码中的debug.h 和 debug.cpp文件。
COMToys 动态链接库DLL
更多精彩
赞助商链接