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

编写可复用性更好的C++代码:Band对象和COMToys(3)

 2006-07-21 11:44:06 来源:WEB开发网   
核心提示: 当用户从菜单选中band时,Windows调用CoCreateInstance或它的同等函数,编写可复用性更好的C++代码:Band对象和COMToys(3)(2),COM则调用DLL中的DllGetClassObject输出函数,而DllGetClassObject又调用AfxDllGe

当用户从菜单选中band时,Windows调用CoCreateInstance或它的同等函数。COM则调用DLL中的DllGetClassObject输出函数,而DllGetClassObject又调用AfxDllGetClassObject。MFC用正确的ID搜索到一个类工厂并将它返回。然后COM调用IClassFactory::CreateInstance进行一系列的COM常规处理。

接着,Windows查询IDeskBand 和IObjectWithSite接口。CBandObj以常用的MFC方式实现这些接口--使用嵌套类,接口映射,以及BEGIN/END_INTERFACE_PART,然后MFC返回正确的指针。

Windows调用IObjectWithSite::SetSite给出一个(IUnknown*)类型的指针指向对象容器。CBandObj::XObjectWithSite::GetSite调用CBandObj::OnSetSite虚函数,将嵌套类方法转换成父类的虚函数调用,以便你能轻松地重载。缺省的实现将现场m_spSite存储在中。你可以在m_spSite中查询(QueryInterface)任何容器实现的接口。CBandObj使用它获得其父窗口的HWND: CComQIPtr spOleWin = m_spSite;
if (!spOleWin)
  return E_FAIL;
HWND hwndParent = NULL;
spOleWin->GetWindow(&hwndParent);
if (!hwndParent)
  return E_FAIL;   
  当Windows调用SetSite时,它希望你创建自己的窗口。从有关说明文档中很难看出这一点来,我只是觉得很别扭。CBandObj::OnSetSite调用虚函数OnCreateWindow来做这个工作。我的缺省实现可以注册并创建通用的不可见窗口。 BOOL CBandObj::OnCreateWindow(CWnd* pParent, const CRect& rc)
{
  static BOOL bRegistered = FALSE;
  static CCriticalSection cs; // protection
  CTLockData lock(cs);
  // 注册窗口类
  if (!bRegistered) {
   AfxRegisterClass(...);
   bRegistered = TRUE;
  }
  return CWnd::Create(BANDOBJCLASS,...);
}  
  Band对象的线程模型是"Apartment",所以对全程变量的保护很重要。最好是尽可能让全程变量与使用它们的函数保持紧密联系。在例子中,OnCreateWindow是唯一使用bRegistered的函数,所以是一个静态函数。你可以重载OnCreateWindow来创建自己的窗口类,和/或者重载PreCreateWindow来改变窗口的某些属性。只是要记住:你创建的窗口一定要是不可见的,既保证不要使用WS_VISIBLE来创建窗口。

Tags:编写 复用 更好

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