编写可复用性更好的C++代码:Band对象和COMToys(2)
2006-07-21 11:44:10 来源:WEB开发网核心提示: CBandObjFactory::CBandObjFactory(REFCLSID clsid, CRuntimeClass* pClass, const CATID& catid, UINT nIDRes) :COleObjectFactory(clsid, pClass, FALSE,
CBandObjFactory::CBandObjFactory(REFCLSID clsid,
CRuntimeClass* pClass,
const CATID& catid, UINT nIDRes)
: COleObjectFactory(clsid, pClass, FALSE, NULL)
{
m_catid = catid;
m_nIDRes = nIDRes;
}
BandObj并不像通常的方式处理类工厂,一般在MFC中编写COM对象时,都使用DECLARE_OLECREATE 和IMPLEMENT_OLECREATE,它把COleObjectFactory创建成一个静态对象。使用这些宏的问题之一是它们将类COleObjectFactory写死在代码中了,这样你就无法使用其它的类,问题之二是它们将类工厂创建成静态数据,再一次将CYourClass::命名的类工厂代码写死了。所以说,何必非得用这些宏呢?之所以提供它们是出于方便。如果想在堆中而不是在栈中创建自己的类工厂并使用某些其它类的话,这样做是有好处的。只要我从COleObjectFactory派生,当COM调用DLL创建对象时,每一个对象工厂类COleObjectFactory会将自己添加到某个MFC搜索的主列表中,这样MFC也就会在创建对象时找到这个类。通过在堆中动态创建类工厂,从而BandObj能在程序员视野中隐藏起来。
MyBands服务程序的注册
从技术上讲,现在还是没有完全弄清楚band对象的全貌,但是不要着急,下面我们来研究一下注册问题。注册就像呼吸之于鼻子一样,在COM中不可或缺。下面是Web搜索框在我的机器上的注册表中的注册入口:
HKEY_CLASSES_ROOT
CLSID
{4647E383-520B-11d2-A0D0-004033D0645D} = "&Web 搜索框"
InprocServer32 = MyBands.dll
ThreadingModel=Apartment
Implemented Categories
{00021492-0000-0000-C000-000000000046}
前面的三个注册内容是所有进程内COM服务器都有的:
更多精彩
赞助商链接