编写可复用性更好的C++代码:Band对象和COMToys(2)
2006-07-21 11:44:10 来源:WEB开发网核心提示: 使用ATL的注册器很容易,例如:CComPtr<IRegistrar>ireg;ireg.CoCreateInstance(CLSID_Registrar, NULL, CLSCTX_INPROC);ireg->FileRegister("foo.rgs&quo
使用ATL的注册器很容易。例如:
CComPtr<IRegistrar>ireg;
ireg.CoCreateInstance(CLSID_Registrar,
NULL, CLSCTX_INPROC);
ireg->FileRegister("foo.rgs");
这段代码第一行中的尖括弧很有意思,它是一个ATL的智能指针(下文将要讨论)。CoCreateInstance创建一个注册器对象,然后直接使用它即可。但是我对尖括弧有点神经质,讨厌在代码中看到这种尖括弧,除非必须用它来做比较和转换。所以我在COMToys中写了一个小类 CIRegistrar 来进一步简化它,并且隐藏了不顺眼的尖括弧,这个类实际上是封装了ATL智能指针:
CTRegistrar r;
r->FileRegister("foo.rgs");
这样一来,你只要实例化CTRegistrar,由构造函数调用CoCreateInstance,FileRegister("foo.rgs")方法的调用不变。IRegistrar具备从脚本文件--甚至是资源--进行注册和注销的能力,IRegistrar的所有方法都在atliface.h文件中。CBandObjFactory::UpdateRegistry中有一个通用实现负责查找与类工厂有相同ID的注册资源并调用注册器加载它。
BOOL CBandObjFactory::UpdateRegistry(BOOL bRegister)
{
static const LPOLESTR RT_REGISTRY =
OLESTR("REGISTRY");
UINT nID = GetResourceID();
if (!::FindResource(AfxGetResourceHandle(),
MAKEINTRESOURCE(nID), CString(RT_REGISTRY)))
return FALSE;
CTRegistrar iReg;
OnInitRegistryVariables(iReg); // see below
LPOLESTR lposModuleName = /* get module pathname */
HRESULT hr = bRegister ?
iReg->ResourceRegister(lposModuleName, nID,
RT_REGISTRY) :
iReg->ResourceUnregister(lposModuleName, nID,
RT_REGISTRY);
return SUCCEEDED(hr);
}
这里使用了典型的MFC处理资源的方法,BandObj很好地利用了资源IDs。对注册和注销自己的band对象要做的全部工作就是写一个注册脚本--而不必写任何代码!并且在代码中只涉及一个函数。实际上,你甚至都不用写注册脚本,因为BandObj例子程序已经写好了一个脚本文件,它适用于任何band对象。直接使用它即可。
更多精彩
赞助商链接