能力值:
( LV3,RANK:20 )
|
-
-
2 楼
这玩意儿,自己写非常的麻烦,我倒是写过,确实非常的麻烦,没有API可以直接解决,要用COM。
如果你要自己实现,必须要求你有比较强的DEBUG技能,知道怎么跟踪MFC实现并自己整理思路。
我只能把大致思路和概念说下:
1、需要三个东西,IOleClientSite*负责显示空间,IStorage*负责存储空间,IOleObject*通用Ole对象
2、调用StgCreateDocfile可得到一个IStorage*存储空间,而显示空间貌似没有办法直接创建,需要自己继承IOleClientSite并实现其所需的几个接口(实现时需要同时继承IOleClientSite、IOleInPlaceSite、IOleInPlaceFrame、IDocHostUIHandler,但某些接口可以不实现直接返回E_NOTIMPL),继承并实现后可以得到一个IOleClientSite*显示空间,然后以IOleClientSite*和IStorage*做为参数,调用OleCreate,第一个参数填CLSID_WebBrowser,第二个参数填IID_IOleObject,这样可以得到一个WebBrowser的OLE对象,如果是内嵌式的不需要菜单状态栏还需要IOleObject::DoVerb一下,如果需要事件还要再ConnectToConnectionPoint,第二个参数填DIID_DWebBrowserEvents2。
3、用IOleObject*进行QueryInterface参数填IID_IWebBrowser2得到一个IWebBrowser2接口,最后调IWebBrowser2::Navigate完成任务。
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
还有使用前记得初始化OLE环境,否则OLE对象可能会创建不出来。如果你一定要研究这个,难点在于自己继承并实现一个IOleClientSite*,我当初是用了Hook的手段调试MFC程序,印象中是apihook挂QueryInterface,返回一个自己假IOleClientSite对象,内部调用真IOleClientSite的接口,在假IOleClientSite对象的所有接口中进行打印参数等等,这样可以获知哪些接口有用,哪些没用直接返回E_NOTIMPL,哪些接口即使有用也只是返回E_NOTIMPL等等,另外由于hook了QueryInterface,还可以知道另外需要IOleInPlaceSite、IOleInPlaceFrame、IDocHostUIHandler,因为它们曾经被QueryInterface过,都需要自己实现,因此一起继承实现,再然后还要对它们用假接口替换做桥,也得到其接口的实际使用方式等。
|
|
|