static HRESULT WINAPI OleDocument_CreateView(IOleDocument *iface, IOleInPlaceSite *pIPSite, IStream *pstm, DWORD dwReserved, IOleDocumentView **ppView) { HTMLDocument *This = impl_from_IOleDocument(iface); HRESULT hres; TRACE("(%p)->(%p %p %d %p)\n", This, pIPSite, pstm, dwReserved, ppView); if(!ppView) return E_INVALIDARG; /* FIXME: * Windows implementation creates new IOleDocumentView when function is called for the * first time and returns E_FAIL when it is called for the second time, but it doesn't matter * if the application uses returned interfaces, passed to ActivateMe or returned by * QueryInterface, so there is no reason to create new interface. This needs more testing. */ if(pIPSite) { hres = IOleDocumentView_SetInPlaceSite(&This->IOleDocumentView_iface, pIPSite); if(FAILED(hres)) return hres; } if(pstm) FIXME("pstm is not supported\n"); IOleDocumentView_AddRef(&This->IOleDocumentView_iface); *ppView = &This->IOleDocumentView_iface; return S_OK; }
void deactivate_document(DocHost *This) { IOleInPlaceObjectWindowless *winobj; IOleObject *oleobj = NULL; IHlinkTarget *hlink = NULL; HRESULT hres; if(This->doc_navigate) { IUnknown_Release(This->doc_navigate); This->doc_navigate = NULL; } if(This->is_prop_notif) advise_prop_notif(This, FALSE); if(This->view) IOleDocumentView_UIActivate(This->view, FALSE); hres = IUnknown_QueryInterface(This->document, &IID_IOleInPlaceObjectWindowless, (void**)&winobj); if(SUCCEEDED(hres)) { IOleInPlaceObjectWindowless_InPlaceDeactivate(winobj); IOleInPlaceObjectWindowless_Release(winobj); } if(This->view) { IOleDocumentView_Show(This->view, FALSE); IOleDocumentView_CloseView(This->view, 0); IOleDocumentView_SetInPlaceSite(This->view, NULL); IOleDocumentView_Release(This->view); This->view = NULL; } hres = IUnknown_QueryInterface(This->document, &IID_IOleObject, (void**)&oleobj); if(SUCCEEDED(hres)) IOleObject_Close(oleobj, OLECLOSE_NOSAVE); hres = IUnknown_QueryInterface(This->document, &IID_IHlinkTarget, (void**)&hlink); if(SUCCEEDED(hres)) { IHlinkTarget_SetBrowseContext(hlink, NULL); IHlinkTarget_Release(hlink); } if(oleobj) { IOleClientSite *client_site = NULL; IOleObject_GetClientSite(oleobj, &client_site); if(client_site) { if(client_site == &This->IOleClientSite_iface) IOleObject_SetClientSite(oleobj, NULL); IOleClientSite_Release(client_site); } IOleObject_Release(oleobj); } IUnknown_Release(This->document); This->document = NULL; }