WEB开发网
开发学院软件开发VC 编写可复用性更好的C++代码:Band对象和COMToys(2)... 阅读

编写可复用性更好的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对象。直接使用它即可。

上一页  1 2 3 4 5  下一页

Tags:编写 复用 更好

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接