- UID
- 5137
- 帖子
- 138
- 精华
- 3
- 贡献
- 24
- 推广
- 0
- 有效BUG
- 0
- 注册时间
- 2005-11-25
|
把COM组件接口和插件关联起来
为了让TW的主程序能够通过接口调用我们的插件,我们还需要在接口当中实现我们的调用逻辑。为此,我们需要实现SetSite,GetBandInfo,GetWindow三个函数
SetSite是从IObjectWithSite继承下来的,作用是通知插件标签页被切换。我们可以在这里做一些重画工作。
- STDMETHODIMP CTWPlugin::SetSite(IUnknown* punkSite)
- {
- if(punkSite)
- {
- if( !IsWindow() )
- {
- HWND hWndReBar = NULL;
- {
- CComQIPtr<IOleWindow> pOleWindow(punkSite);
- pOleWindow->GetWindow(&hWndReBar);
- }
- if( !::IsWindow( hWndReBar ) ) return E_FAIL;
- if (IsWindow()) DestroyWindow();
- Create(hWndReBar, CWindow::rcDefault);
- if (!IsWindow()) return E_FAIL;
- }
- }
- return S_OK;
- }
复制代码
GetBandInfo用于获得Band对象的显示大小,这里我们假设插件的显示大小固定为120×24。代码如下:
- STDMETHODIMP CTWPlugin::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi)
- {
- m_dwBandID = dwBandID;
- int nHeight = 24;
- int nWidth = 120;
- if( pdbi)
- {
- if( pdbi->dwMask & DBIM_MINSIZE)
- {
- pdbi->ptMinSize.x = nWidth; //最小显示尺寸
- pdbi->ptMinSize.y = nHeight;
- }
- if( pdbi->dwMask & DBIM_MAXSIZE)
- {
- pdbi->ptMaxSize.x = 0; //该参数没有用
- pdbi->ptMaxSize.y = nHeight;
- }
- if( pdbi->dwMask & DBIM_MODEFLAGS)
- {
- pdbi->dwModeFlags = DBIMF_NORMAL;
- }
- if( pdbi->dwMask & DBIM_ACTUAL)
- {
- pdbi->ptActual.x = 50; //超过这个尺寸不显示图标
- pdbi->ptActual.y = nHeight;
- }
- if (pdbi->dwMask & DBIM_TITLE)
- {
- ZeroMemory(pdbi->wszTitle, sizeof(pdbi->wszTitle));
- }
- }
- return S_OK;
- }
复制代码
最后,我们需要实现GetWindow,用于获取插件的窗口句柄HWND
- STDMETHODIMP CTWPlugin::GetWindow(HWND *phWnd)
- {
- if ( NULL == phWnd )
- return E_INVALIDARG;
- *phWnd = m_hWnd;
- return S_OK;
- }
复制代码
至此,插件的代码开发工作就全部完成了。发布前记住要把dll编译成Release版本,而不要直接发布debug版。我一般会选择Release MinDependency。
作为最后的收官工作,要写一个plugin.ini放到插件目录下,声明版本号,插件文件名,CLSID等信息,以便TW的插件管理器读取。下面是一个例子
- [General]
- Name=TWPluginDev
- NameCN=开发示例
- Author=henryouly
- Version=1.0.0.1
- Comments=Dev sample
- FileName=TWPluginDev.dll
- HotIcon=
- Type=STATUSBAR
- ModuleType=COM
- CLSID={43B6A73E-C284-4F98-8328-ABE004C1EF7A}
- StartAfterPageDone=
复制代码
最后,享受COM插件给你带来的乐趣吧。
[ 本帖最后由 needed 于 2008-9-1 13:45 编辑 ] |
|