描述:
一、基于自动化的MFC程序如下:
...
BOOL CCaiApp::InitInstance()
{
COleObjectFactory::RegisterAll();
return TRUE;
}
...
STDAPI DllRegisterServer(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
COleObjectFactory::UpdateRegistryAll();
return S_OK;
}
...
请问,RegisterAll()和UpdateRegistryAll()是不是重复调用了?不是都是注册类厂吗?
二、
DllRegisterServer、DllCanunLoadNow、DllGetClassObject 这三个函数是否都是导出函数?
三、
是不是先装载了COM组件程序(DLL程序)才能获取类厂表中内容?
四、类厂表中的内容是如何添加进去的?
解决方案1:
RegisterAll()是创建当前COM组件(DLL)中的所有类厂的一个实例,并将它们的指针记到MFC中的模块状态(一个结构)的一个全局实例,以供后面当DllGetClassObject被调用时返回类厂的实例。
UpdateRegistryAll()是更新当前COM组件(DLL)中的所有COM接口类的注册表信息,不生成类厂的实例,所以在DllRegisterServer中调用。
至于楼主所谓的类厂表也就是模块状态的一个成员,在COleObjectFactory的构造函数中,将自己(this)添加到类厂表中,楼主可以查看MFC源码即可明了。因此RegisterAll中才能将当前这个模块(DLL或EXE)中的所有类厂注册和生成,由IMPLEMENT_OLECREATE和DECLARE_OLECREATE及COleObjectFactory::COleObjectFactory共同完成的