// @pymethod |PyIOleObject|SetClientSite|Description of SetClientSite. PyObject *PyIOleObject::SetClientSite(PyObject *self, PyObject *args) { IOleObject *pIOO = GetI(self); if ( pIOO == NULL ) return NULL; // @pyparm <o PyIOleClientSite>|pClientSite||Description for pClientSite PyObject *obpClientSite; IOleClientSite * pClientSite; if ( !PyArg_ParseTuple(args, "O:SetClientSite", &obpClientSite) ) return NULL; BOOL bPythonIsHappy = TRUE; if (!PyCom_InterfaceFromPyInstanceOrObject(obpClientSite, IID_IOleClientSite, (void **)&pClientSite, TRUE /* bNoneOK */)) bPythonIsHappy = FALSE; if (!bPythonIsHappy) return NULL; HRESULT hr; PY_INTERFACE_PRECALL; hr = pIOO->SetClientSite( pClientSite ); if (pClientSite) pClientSite->Release(); PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return OleSetOleError(hr); Py_INCREF(Py_None); return Py_None; }
bool WebBrowserContainer::Initialize(HWND parentWindow) { this->hwnd = parentWindow; IOleObject* oleObject = NULL; HRESULT hRes = CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IOleObject, (void**)&oleObject); if (FAILED(hRes)) { Logger::Error("WebBrowserContainer::Inititalize(), CoCreateInstance(CLSID_WebBrowser) failed!, error code %i", hRes); return false; } hRes = oleObject->SetClientSite(this); if (FAILED(hRes)) { Logger::Error("WebBrowserContainer::Inititalize(), IOleObject::SetClientSite() failed!, error code %i", hRes); oleObject->Release(); return false; } // Activating the container. RECT rect = {0}; GetClientRect(hwnd, &rect); hRes = oleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, this, 0, this->hwnd, &rect); if (FAILED(hRes)) { Logger::Error("WebBrowserContainer::InititalizeBrowserContainer(), IOleObject::DoVerb() failed!, error code %i", hRes); oleObject->Release(); return false; } // Prepare the browser itself. hRes = oleObject->QueryInterface(IID_IWebBrowser2, (void**)&this->webBrowser); if (FAILED(hRes)) { Logger::Error("WebViewControl::InititalizeBrowserContainer(), IOleObject::QueryInterface(IID_IWebBrowser2) failed!, error code %i", hRes); oleObject->Release(); return false; } sink = new EventSink(); EventSink* s = (EventSink*)sink; hRes = s->DispEventAdvise(webBrowser, &DIID_DWebBrowserEvents2); if (FAILED(hRes)) { Logger::Error("WebViewControl::InititalizeBrowserContainer(), EventSink::DispEventAdvise(&DIID_DWebBrowserEvents2) failed!, error code %i", hRes); return false; } // Initialization is OK. oleObject->Release(); return true; }
IEView::~IEView() { IOleObject* pOleObject = NULL; { mir_cslock lck(mutex); if (list == this) list = next; else if (prev != NULL) prev->next = next; if (next != NULL) next->prev = prev; prev = NULL; next = NULL; } if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleObject, (void**)&pOleObject))) { pOleObject->SetClientSite(NULL); pOleObject->Release(); } else MessageBox(NULL, TranslateT("IID_IOleObject failed."), TranslateT("RESULT"), MB_OK); if (builder != NULL) { delete builder; builder = NULL; } if (m_pConnectionPoint != NULL) { m_pConnectionPoint->Unadvise(m_dwCookie); m_pConnectionPoint->Release(); } mir_free(selectedText); if (sink != NULL) delete sink; pWebBrowser->Release(); DestroyWindow(hwnd); }
IEView::IEView(HWND parent, HTMLBuilder* builder, int x, int y, int cx, int cy) { MSG msg; IOleObject* pOleObject = NULL; IOleInPlaceObject *pOleInPlace; this->parent = parent; this->builder = builder; this->smileyWindow = NULL; prev = next = NULL; hwnd = NULL; sink = NULL; pWebBrowser = NULL; m_pConnectionPoint = NULL; m_cRef = 0; #ifdef GECKO if (SUCCEEDED(CoCreateInstance(CLSID_MozillaBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (LPVOID*)&pWebBrowser))) { #else if (SUCCEEDED(CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (LPVOID*)&pWebBrowser))) { #endif // pWebBrowser->put_RegisterAsBrowser(VARIANT_FALSE); // pWebBrowser->put_RegisterAsDropTarget(VARIANT_FALSE); if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleObject, (void**)&pOleObject))) { rcClient.left = x; rcClient.top = y; rcClient.right = x + cx; rcClient.bottom = y + cy; pOleObject->SetClientSite(this); pOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, &msg, this, 0, parent, &rcClient); pOleObject->Release(); } else { MessageBox(NULL,"IID_IOleObject failed.","RESULT",MB_OK); } if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleInPlaceObject, (void**)&pOleInPlace))) { pOleInPlace->GetWindow(&hwnd); pOleInPlace->Release(); } else { MessageBox(NULL,"IID_IOleInPlaceObject failed.","RESULT",MB_OK); } LONG style = GetWindowLong(hwnd, GWL_EXSTYLE); style |= (WS_EX_STATICEDGE); SetWindowLong(hwnd,GWL_EXSTYLE,style); IConnectionPointContainer* pCPContainer; // Step 1: Get a pointer to the connection point container. if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPContainer))) { // m_pConnectionPoint is defined like this: // Step 2: Find the connection point. if (SUCCEEDED(pCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_pConnectionPoint))) { // Step 3: Advise the connection point that you // want to sink its events. sink = new IEViewSink(); #ifndef GECKO if (FAILED(m_pConnectionPoint->Advise((IUnknown *)sink, &m_dwCookie))) { MessageBox(NULL, "Failed to Advise", "C++ Event Sink", MB_OK); } #endif } pCPContainer->Release(); } #ifndef GECKO setUserWndProc((WNDPROC)SetWindowLong(hwnd, GWL_WNDPROC, (LONG) IEViewWindowProcedure)); #endif } EnterCriticalSection(&mutex); next = list; if (next != NULL) { next->prev = this; } list = this; LeaveCriticalSection(&mutex); clear(); } IEView::IEView(HWND parent, SmileyWindow* smileyWindow, int x, int y, int cx, int cy) { MSG msg; IOleObject* pOleObject = NULL; IOleInPlaceObject *pOleInPlace; this->parent = parent; builder = NULL; this->smileyWindow = smileyWindow; prev = next = NULL; hwnd = NULL; sink = NULL; pWebBrowser = NULL; m_pConnectionPoint = NULL; m_cRef = 0; #ifdef GECKO if (SUCCEEDED(CoCreateInstance(CLSID_MozillaBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (LPVOID*)&pWebBrowser))) { #else if (SUCCEEDED(CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (LPVOID*)&pWebBrowser))) { #endif // pWebBrowser->put_RegisterAsBrowser(VARIANT_FALSE); // pWebBrowser->put_RegisterAsDropTarget(VARIANT_FALSE); if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleObject, (void**)&pOleObject))) { rcClient.left = x; rcClient.top = y; rcClient.right = x + cx; rcClient.bottom = y + cy; pOleObject->SetClientSite(this); pOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, &msg, this, 0, parent, &rcClient); pOleObject->Release(); } else { MessageBox(NULL,"IID_IOleObject failed.","RESULT",MB_OK); } if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleInPlaceObject, (void**)&pOleInPlace))) { pOleInPlace->GetWindow(&hwnd); pOleInPlace->Release(); } else { MessageBox(NULL,"IID_IOleInPlaceObject failed.","RESULT",MB_OK); } IConnectionPointContainer* pCPContainer; // Step 1: Get a pointer to the connection point container. if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPContainer))) { // m_pConnectionPoint is defined like this: // Step 2: Find the connection point. if (SUCCEEDED(pCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_pConnectionPoint))) { // Step 3: Advise the connection point that you // want to sink its events. sink = new IEViewSink(smileyWindow); #ifndef GECKO if (FAILED(m_pConnectionPoint->Advise((IUnknown *)sink, &m_dwCookie))) { MessageBox(NULL, "Failed to Advise", "C++ Event Sink", MB_OK); } #endif } pCPContainer->Release(); } } clear(); } IEView::~IEView() { IOleObject* pOleObject = NULL; if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleObject, (void**)&pOleObject))) { pOleObject->SetClientSite(NULL); pOleObject->Release(); } else { MessageBox(NULL,"IID_IOleObject failed.","RESULT",MB_OK); } EnterCriticalSection(&mutex); if (list == this) { list = next; } else if (prev!=NULL) { prev->next = next; } if (next != NULL) { next->prev = prev; } LeaveCriticalSection(&mutex); if (builder != NULL) { delete builder; builder = NULL; } if (m_pConnectionPoint != NULL) { m_pConnectionPoint->Unadvise(m_dwCookie); m_pConnectionPoint->Release(); } if (sink != NULL) { delete sink; } pWebBrowser->Release(); DestroyWindow(hwnd); } void IEView::setUserWndProc(WNDPROC wndProc) { userWndProc = wndProc; } WNDPROC IEView::getUserWndProc() { return userWndProc; } // IUnknown STDMETHODIMP IEView::QueryInterface(REFIID riid, PVOID *ppv) { *ppv=NULL; if (IID_IUnknown==riid) *ppv=this; if (IID_IOleClientSite==riid) *ppv=(IOleClientSite*)this;//Unknown)m_pIOleClientSite; if (IID_IOleWindow==riid || IID_IOleInPlaceSite==riid) *ppv=(IOleInPlaceSite*)this;//m_pIOleIPSite; if (IID_IDocHostUIHandler==riid) *ppv=(IDocHostUIHandler*)this;//m_pIOleIPSite; if (NULL!=*ppv) { ((LPUNKNOWN)*ppv)->AddRef(); return NOERROR; } return E_NOINTERFACE; }
// 插入表情图片 BOOL RichEdit_InsertFace(ITextServices *pTextServices, ITextHost *pTextHost, LPCTSTR lpszFileName, int nFaceId, int nFaceIndex, COLORREF clrBg, BOOL bAutoScale, int nReservedWidth) { BSTR bstrFileName = NULL; IRichEditOle * pRichEditOle = NULL; IOleClientSite *pOleClientSite = NULL; IImageOle* pImageOle = NULL; IOleObject *pOleObject = NULL; REOBJECT reobject = {0}; HRESULT hr = E_FAIL; if (NULL == pTextServices || NULL == pTextHost || NULL == lpszFileName || NULL == *lpszFileName) return FALSE; TCHAR cProtocol[16] = {0}; _tcsncpy(cProtocol, lpszFileName, 7); if ((_tcsicmp(cProtocol, _T("http://")) != 0) && ::GetFileAttributes(lpszFileName) == 0xFFFFFFFF) return FALSE; bstrFileName = ::SysAllocString(lpszFileName); if (NULL == bstrFileName) return FALSE; pTextServices->TxSendMessage(EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle, NULL); if (NULL == pRichEditOle) goto Ret0; hr = ::CoCreateInstance(CLSID_ImageOle, NULL, CLSCTX_INPROC_SERVER, IID_IImageOle, (void**)&pImageOle); if (FAILED(hr)) goto Ret0; hr = pImageOle->QueryInterface(IID_IOleObject, (void **)&pOleObject); if (FAILED(hr)) goto Ret0; pRichEditOle->GetClientSite(&pOleClientSite); if (NULL == pOleClientSite) goto Ret0; pOleObject->SetClientSite(pOleClientSite); pImageOle->SetTextServices(pTextServices); pImageOle->SetTextHost(pTextHost); pImageOle->SetFaceId(nFaceId); pImageOle->SetFaceIndex(nFaceIndex); pImageOle->SetBgColor(clrBg); pImageOle->SetAutoScale(bAutoScale, nReservedWidth); pImageOle->LoadFromFile(bstrFileName); hr = ::OleSetContainedObject(pOleObject, TRUE); reobject.cbStruct = sizeof(REOBJECT); reobject.clsid = CLSID_ImageOle; reobject.cp = REO_CP_SELECTION; reobject.dvaspect = DVASPECT_CONTENT; reobject.dwFlags = REO_BELOWBASELINE; reobject.poleobj = pOleObject; reobject.polesite = pOleClientSite; reobject.dwUser = 0; hr = pRichEditOle->InsertObject(&reobject); Ret0: if (pOleObject != NULL) pOleObject->Release(); if (pImageOle != NULL) pImageOle->Release(); if (pOleClientSite != NULL) pOleClientSite->Release(); if (pRichEditOle != NULL) pRichEditOle->Release(); if (bstrFileName != NULL) ::SysFreeString(bstrFileName); return SUCCEEDED(hr); }
IEView::IEView(HWND parent, HTMLBuilder* builder, int x, int y, int cx, int cy) { MSG msg; IOleObject* pOleObject = NULL; IOleInPlaceObject *pOleInPlace; isContactSet = false; this->parent = parent; this->builder = builder; prev = next = NULL; hwnd = NULL; sink = NULL; pWebBrowser = NULL; m_pConnectionPoint = NULL; m_cRef = 0; selectedText = NULL; getFocus = false; rcClient.left = x; rcClient.top = y; rcClient.right = x + cx; rcClient.bottom = y + cy; if (SUCCEEDED(CoCreateInstance(CLSID_WebBrowser, NULL, CLSCTX_INPROC, IID_IWebBrowser2, (LPVOID*)&pWebBrowser))) { if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleObject, (void**)&pOleObject))) { pOleObject->SetClientSite(this); pOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, &msg, this, 0, this->parent, &rcClient); pOleObject->Release(); } else { MessageBox(NULL, TranslateT("IID_IOleObject failed."), TranslateT("RESULT"), MB_OK); } if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IOleInPlaceObject, (void**)&pOleInPlace))) { pOleInPlace->GetWindow(&hwnd); pOleInPlace->Release(); } else { MessageBox(NULL, TranslateT("IID_IOleInPlaceObject failed."), TranslateT("RESULT"), MB_OK); } setBorder(); IConnectionPointContainer* pCPContainer; // Step 1: Get a pointer to the connection point container. if (SUCCEEDED(pWebBrowser->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPContainer))) { // m_pConnectionPoint is defined like this: // Step 2: Find the connection point. if (SUCCEEDED(pCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_pConnectionPoint))) { // Step 3: Advise the connection point that you // want to sink its events. sink = new IEViewSink(this); if (FAILED(m_pConnectionPoint->Advise((IUnknown *)sink, &m_dwCookie))) { MessageBox(NULL, TranslateT("Failed to Advise"), TranslateT("C++ Event Sink"), MB_OK); } } pCPContainer->Release(); } setMainWndProc((WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) IEViewWindowProcedure)); } { mir_cslock lck(mutex); next = list; if (next != NULL) next->prev = this; list = this; } pWebBrowser->put_RegisterAsDropTarget(VARIANT_FALSE); }