现在的位置: 首页 > 综合 > 正文

使用C++实现SDK之WebBrowser容器

2013年09月16日 ⁄ 综合 ⁄ 共 2485字 ⁄ 字号 评论关闭

一.由来

         我还记还得当自认为学习完了C++语法后, 兴致勃勃的打开MFC向导,开始所谓"MFC高级自动化编程"时, 我不由喊道: 这他妈的都是些什么乱七八糟的东西啊.诚然,MFC为了方便愚蠢的程序员,的确是让人瞬间高级编程, 可是愚蠢的我们还是会用CString strTest;写出(PWSTR)strTest.GetBuffer() 这种自作聪明的用法,结果就是整个程序好像发了疯.
         终于有一天,我大喊一声: 滚蛋吧,MFC!
         太阳当空照,上帝对 我笑:  你Y去写个有WebBrowser控件的窗口吧
二.结构
          MFC的HTMLDialog 是一个魔盒, 他容易上手,可是却很难深入,究其缘由, 私以为无外乎MFC包装的太好, 不识庐山真面目,只缘身在此山中.  总是以为作为C类型的程序员,喜欢深入原理是职业特性.
        于是首先看到有强人写的纯C实现WebBrowser控件,他在这里: http://www.codeproject.com/KB/COM/cwebpage.aspx 这位同志很好的展示了在没有C++的支持下,支持ActiveX是多么痛苦的一件事情...........汗.
在下觉得,撇开C++的类的特性,虚拟特性,重载特性,而去用纯C实现,实在有点过犹不及,当然这种练习修炼内功很好,但是实际应用上显得麻烦.毕竟,ActiveX很好的使用了C++的特性,而不是C的特性.
        接着,开始使用纯SDK编写容器. 读者可以搜索csdn中关于SDK实现WebBrowser容器的帖子, 许多人说那是非常繁琐复杂.所谓人云亦云,各位看官不妨跟着我一试,且看到底何如?
       WebBrowser容器的实现需要许多接口, 也许正是这吓退了许多人, 实际情况是,许多接口的方法没几个需要实现,大部分只需要直接返回E_NOTIMPL和S_OK, E_FAIL.
       让我们命名我们编写的容器叫 WebBrowser (可能名字有点糊涂,但是因为源代码中就是这个名字,所以就不改了,大家只需要注意,这个是一个WebBrowser控件的容器 ),   在实现这个容器后, 我们把他作为一个窗口类的父类,这样 就能实现WebBrowser的页面窗口.
      首先一个WB( WebBrowser) 容器需要以下接口:
  1.     public IDispatch
  2.     public IOleClientSite
  3.     public IOleInPlaceSite
  4.     public IOleInPlaceFrame

       每个接口需要实现的方法分别是:

  1.         // IUnknown methods
  2.     virtual STDMETHODIMP QueryInterface(REFIID iid,void**ppvObject);
  3.     virtual STDMETHODIMP_(ULONG) AddRef();
  4.     virtual STDMETHODIMP_(ULONG) Release();
  5.     // IDispatch Methods
  6.     HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo);
  7.     HRESULT _stdcall GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo);
  8.     HRESULT _stdcall GetIDsOfNames(REFIID riid,OLECHAR FAR* FAR* rgszNames,unsigned int cNames,LCID lcid,DISPID FAR* rgDispId);
  9.     HRESULT _stdcall Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR* pDispParams,VARIANT FAR* pVarResult,EXCEPINFO FAR* pExcepInfo,unsigned int FAR* puArgErr);
  10.     // IOleClientSite methods
  11.     virtual STDMETHODIMP SaveObject();
  12.     virtual STDMETHODIMP GetMoniker(DWORD dwA,DWORD dwW,IMoniker**pm);
  13.     virtual STDMETHODIMP GetContainer(IOleContainer**pc);
  14.     virtual STDMETHODIMP ShowObject();
  15.     virtual STDMETHODIMP OnShowWindow(BOOL f);
  16.     virtual STDMETHODIMP RequestNewObjectLayout();
  17.     // IOleInPlaceSite methods
  18.     virtual STDMETHODIMP GetWindow(HWND *p);
  19.     virtual STDMETHODIMP ContextSensitiveHelp(BOOL);
  20.     virtual STDMETHODIMP CanInPlaceActivate();
  21.     virtual STDMETHODIMP OnInPlaceActivate();
  22.     virtual STDMETHODIMP OnUIActivate();
  23.     virtual STDMETHODIMP GetWindowContext(IOleInPlaceFrame** ppFrame,IOleInPlaceUIWindow **ppDoc,LPRECT r1,LPRECT r2,LPOLEINPLACEFRAMEINFO o);
  24.     virtual

抱歉!评论已关闭.