返回列表 发帖
把COM组件接口和插件关联起来

为了让TW的主程序能够通过接口调用我们的插件,我们还需要在接口当中实现我们的调用逻辑。为此,我们需要实现SetSite,GetBandInfo,GetWindow三个函数

SetSite是从IObjectWithSite继承下来的,作用是通知插件标签页被切换。我们可以在这里做一些重画工作。

  1. STDMETHODIMP CTWPlugin::SetSite(IUnknown* punkSite)
  2. {
  3.      if(punkSite)
  4.     {
  5.         if( !IsWindow() )
  6.         {
  7.             HWND hWndReBar = NULL;
  8.             {
  9.                 CComQIPtr<IOleWindow> pOleWindow(punkSite);
  10.                 pOleWindow->GetWindow(&hWndReBar);
  11.             }
  12.             if( !::IsWindow( hWndReBar ) ) return E_FAIL;
  13.             if (IsWindow()) DestroyWindow();
  14.             Create(hWndReBar, CWindow::rcDefault);
  15.             if (!IsWindow()) return E_FAIL;
  16.         }
  17.     }

  18.     return S_OK;
  19. }
复制代码



GetBandInfo用于获得Band对象的显示大小,这里我们假设插件的显示大小固定为120×24。代码如下:

  1. STDMETHODIMP CTWPlugin::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi)
  2. {
  3.     m_dwBandID = dwBandID;
  4.     int nHeight = 24;
  5.     int nWidth  = 120;

  6.     if( pdbi)
  7.     {
  8.         if( pdbi->dwMask & DBIM_MINSIZE)
  9.         {
  10.             pdbi->ptMinSize.x = nWidth;            //最小显示尺寸
  11.             pdbi->ptMinSize.y = nHeight;
  12.         }

  13.         if( pdbi->dwMask & DBIM_MAXSIZE)
  14.         {
  15.             pdbi->ptMaxSize.x = 0;            //该参数没有用
  16.             pdbi->ptMaxSize.y = nHeight;
  17.         }


  18.         if( pdbi->dwMask & DBIM_MODEFLAGS)
  19.         {
  20.             pdbi->dwModeFlags = DBIMF_NORMAL;
  21.         }

  22.         if( pdbi->dwMask & DBIM_ACTUAL)
  23.         {
  24.             pdbi->ptActual.x = 50;            //超过这个尺寸不显示图标
  25.             pdbi->ptActual.y = nHeight;
  26.         }


  27.         if (pdbi->dwMask & DBIM_TITLE)
  28.         {
  29.             ZeroMemory(pdbi->wszTitle, sizeof(pdbi->wszTitle));
  30.         }
  31.     }
  32.     return S_OK;
  33. }
复制代码


最后,我们需要实现GetWindow,用于获取插件的窗口句柄HWND

  1. STDMETHODIMP CTWPlugin::GetWindow(HWND *phWnd)
  2. {
  3.     if ( NULL == phWnd )
  4.         return E_INVALIDARG;
  5.     *phWnd = m_hWnd;
  6.     return S_OK;
  7. }
复制代码


至此,插件的代码开发工作就全部完成了。发布前记住要把dll编译成Release版本,而不要直接发布debug版。我一般会选择Release MinDependency。


作为最后的收官工作,要写一个plugin.ini放到插件目录下,声明版本号,插件文件名,CLSID等信息,以便TW的插件管理器读取。下面是一个例子

  1. [General]
  2. Name=TWPluginDev
  3. NameCN=开发示例
  4. Author=henryouly
  5. Version=1.0.0.1
  6. Comments=Dev sample
  7. FileName=TWPluginDev.dll
  8. HotIcon=
  9. Type=STATUSBAR
  10. ModuleType=COM
  11. CLSID={43B6A73E-C284-4F98-8328-ABE004C1EF7A}
  12. StartAfterPageDone=
复制代码



最后,享受COM插件给你带来的乐趣吧。

[ 本帖最后由 needed 于 2008-9-1 13:45 编辑 ]

TOP

返回列表