在《深入浅出MFC》一书的MFC六大关键技术仿真中,说各个类的静态CRuntimeClass成员变量是通过CRuntimeClass中的CRuntimeClass* pNext连接起来的,在动态创建对象时,根据提供的类名在这个链表中查找对应的CRuntimeClass成员,进而能够创建对象。但我在MFC实际的CRuntimeClass结构中并没有找到类似于CRuntimeClass* pNext的成员,大家能告诉我MFC是通过什么方法查找各个类的CRuntimeClass成员变量的吗?
解决方案 »
- 如何用VC6.0从零开始做个dll?不要VC6.0自动生成的东西,比如DllMain函数什么的。
- 发送数据代码
- BCG资源中文化的问题。。。
- 关于CDaoRecordset的问题~~~~插入新的记录出错!
- 使用CDialogBar出错。大家帮忙呀
- 我现在有两个应用程序 app1和app2,...详情请进来看看!(技术讨论)
- 读网卡的mac地址为什么在插网线的前后不一样
- 祝jennyvenus新年快乐...
- 做activex控件问题
- 初学者急需求助关于多媒体编程中遇到的dll的问题,万分火急!!!
- 那位高手知道从国外网站下载的比较好的代理源代码?
- 谁是COM高手??!VB之dll可以被其他高级语言调用吗??
在 哪个文件里可以看到DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC的定义?
CRuntimeClass结构
要理解CObject,我们先来看一下CRuntimeClass这个在MFC中至关重要的一个结构。
每个从CObject中派生的类都有有一个CRuntimeClass对象同它关联以完成在运行时得到类实例的信息或者是它的基类。 在afx.h中它的定义如下:
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName; //类名,一般是指包含CRuntimeClass对象的类的名称
int m_nObjectSize; //包含CRuntimeClass对象的类sizeof的大小,不包括它分配的内存
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class 指向一个建立实例的构造函数#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
CRuntimeClass* m_pBaseClass;
#endif//以上m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表// Operations
CObject* CreateObject(); //这个函数给予CObject 派生类运行时动态建立的能力
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;//这个函数使用 m_pBaseClass或 m_pfnGetBaseClass遍历整个类层次确定是否pBaseClass指向的类是基类,
//使用它可以判断某类是否是从pBaseClass指向的类在派生来。// Implementation
void Store(CArchive& ar) const;
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);// CRuntimeClass objects linked together in simple list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
struct CRuntimeClass
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)();
#ifdef _AFXDLL
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
#else
CRuntimeClass* m_pBaseClass;
#endif// Operations
CObject* CreateObject();
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;// Implementation
void Store(CArchive& ar) const;
static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum); // CRuntimeClass objects linked together in simple list
CRuntimeClass* m_pNextClass
};大家看,是有m_pNextClass这个成员的,但MSDN对CRuntimeClass 的介绍中为什么没有呢?大家可以看一看,afx.h文件中CRuntimeClass定义与MSDN中对CRuntimeClass 的介绍是不一样的。
建议你还是看一下侯老师的书吧。