diff --git a/IEBrowser.cpp b/IEBrowser.cpp index 97f1b3a..d3848dd 100644 --- a/IEBrowser.cpp +++ b/IEBrowser.cpp @@ -9,10 +9,9 @@ #include "Globals.h" #include "ax.h" -//#include "IEDispatcher.h" - void IEBrowser::Boop(char* test) { + // External functions may end up here in the future } IEBrowser::IEBrowser(HWND attachHWnd) { @@ -26,7 +25,6 @@ IEBrowser::IEBrowser(HWND attachHWnd) { } } hwnd = attachHWnd; - spDocument = 0; webBrowser = 0; SendMessage(hwnd,AX_INPLACE,1,0); SendMessage(hwnd,AX_QUERYINTERFACE,(WPARAM)&IID_IWebBrowser2,(LPARAM)&webBrowser); @@ -39,79 +37,17 @@ IEBrowser::~IEBrowser(void) { } } -// Something goes here -int IEBrowser::setExternal(IDispatch** ext) -{ - std::cout << &m_IEDispatcher; - IInternetHostSecurityManager* spSecMan; - spDocument2->QueryInterface(IID_IInternetHostSecurityManager, - (void **) &spSecMan); - - // TODO: hr needs to say: 'S_OK' - //spSecMan->QueryCustomPolicy - HRESULT hr = spSecMan->ProcessUrlAction(URLACTION_ACTIVEX_OVERRIDE_OBJECT_SAFETY, - NULL, 0, NULL, 0, 0, PUAF_WARN_IF_DENIED); - - (*ext) = &m_IEDispatcher; - return 1; -} - bool IEBrowser::navigateSyncURL(wchar_t* url) { MSG messages; if (webBrowser) { webBrowser->Navigate(url,0,0,0,0); - for (int i=1;i<1000;i++) - { - while (PeekMessage (&messages, NULL, 0, 0,PM_REMOVE)) - { - if (IsDialogMessage(hwnd, &messages) == 0) - { - TranslateMessage(&messages); - DispatchMessage(&messages); - } - } - - Sleep(30); - - HRESULT hresult = webBrowser->get_Document(&spDocument); - if (SUCCEEDED(hresult) && (spDocument != 0)) - { - - IOleObject* spOleObject; - if (SUCCEEDED(spDocument->QueryInterface(IID_IOleObject,(void**)&spOleObject))) - { - IOleClientSite* spClientSite; - hresult = spOleObject->GetClientSite(&spClientSite); - if (SUCCEEDED(hresult) && spClientSite) - { - m_spDefaultDocHostUIHandler = spClientSite; - ICustomDoc* spCustomDoc; - - //IEDispatcher* spIEDispatcher; - if (SUCCEEDED(m_spDefaultDocHostUIHandler->QueryInterface(IID_IDocHostUIHandler,(void**)&m_spHandler))) - { - if (SUCCEEDED(spDocument->QueryInterface(IID_ICustomDoc,(void**)&spCustomDoc))) - { - spCustomDoc->SetUIHandler(m_spHandler); - m_spHandler->GetExternal(&m_spExternal); - spDocument->QueryInterface(IID_IHTMLDocument2, (void **) &spDocument2); - setExternal(&m_spExternal); - } - } - } - } - - - - return true; - } - } } else { MessageBox(NULL,"Cannot read IWebBrowser2...",(g_PlaceholderName+" Crash").c_str(),MB_OK); } + return false; } diff --git a/IEBrowser.h b/IEBrowser.h index b3d00dd..1bef0a7 100644 --- a/IEBrowser.h +++ b/IEBrowser.h @@ -14,12 +14,4 @@ class IEBrowser { private: IWebBrowser2* webBrowser; HWND hwnd; - IDispatch* spDocument; - IHTMLDocument* spDocument2; - IDocHostUIHandler* m_spHandler; - IDispatch* m_spExternal; - IDispatch* m_newExternal; - IEDispatcher m_IEDispatcher; - IOleClientSite* m_spDefaultDocHostUIHandler; - int setExternal(IDispatch** ext); }; diff --git a/ax.cpp b/ax.cpp index f636501..b8ce2e1 100644 --- a/ax.cpp +++ b/ax.cpp @@ -11,7 +11,6 @@ #pragma warning (disable: 4244) #pragma warning (disable: 4800) - // AXClientSite class // ------- Implement member functions AXClientSite :: AXClientSite() @@ -26,6 +25,83 @@ AXClientSite :: ~AXClientSite() } +STDMETHODIMP AXClientSite :: ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: GetHostInfo(DOCHOSTUIINFO *pInfo) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: ShowUI( DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: HideUI( void) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: UpdateUI( void) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: OnDocWindowActivate(BOOL fActivate) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: OnFrameWindowActivate(BOOL fActivate) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: ResizeBorder( LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: TranslateAccelerator( LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: GetOptionKeyPath( LPOLESTR *pchKey, DWORD dw) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: GetDropTarget( IDropTarget *pDropTarget, IDropTarget **ppDropTarget) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: GetExternal(IDispatch **ppDispatch) +{ + //IDispatch* disp = ax->GetExternalDispatch(); + *ppDispatch = this; + /* if (disp!=NULL) + { + *ppDispatch = this; + return S_OK; + } */ + return S_OK; +} + +STDMETHODIMP AXClientSite ::TranslateUrl( DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut) +{ + return E_NOTIMPL; +} + +STDMETHODIMP AXClientSite :: FilterDataObject( IDataObject *pDO, IDataObject **ppDORet) +{ + return E_NOTIMPL; +} + // IUnknown methods STDMETHODIMP AXClientSite :: QueryInterface(REFIID iid,void**ppvObject) { @@ -46,6 +122,8 @@ STDMETHODIMP AXClientSite :: QueryInterface(REFIID iid,void**ppvObject) *ppvObject = (IOleInPlaceFrame*)this; if (iid == IID_IOleInPlaceUIWindow) *ppvObject = (IOleInPlaceUIWindow*)this; + if (iid == IID_IDocHostUIHandler) + *ppvObject = (IDocHostUIHandler*)this; } //* Log Call @@ -229,9 +307,9 @@ STDMETHODIMP AXClientSite :: SetActiveObject(IOleInPlaceActiveObject*pV,LPCOLEST STDMETHODIMP AXClientSite :: SetStatusText(LPCOLESTR t) - { +{ return E_NOTIMPL; - } +} STDMETHODIMP AXClientSite :: EnableModeless(BOOL f) { @@ -251,14 +329,21 @@ HRESULT _stdcall AXClientSite :: GetTypeInfoCount( HRESULT _stdcall AXClientSite :: GetTypeInfo( unsigned int iTInfo, LCID lcid, - ITypeInfo FAR* FAR* ppTInfo) {return E_NOTIMPL;} + ITypeInfo FAR* FAR* ppTInfo) +{ + return E_NOTIMPL; +} HRESULT _stdcall AXClientSite :: GetIDsOfNames( REFIID riid, - OLECHAR FAR* FAR*, + OLECHAR FAR* FAR* ext_function_name, unsigned int cNames, LCID lcid, - DISPID FAR* ) {return E_NOTIMPL;} + DISPID FAR* ) +{ + m_lastExternalName = *ext_function_name; + return S_OK; +} // Other Methods @@ -284,8 +369,6 @@ AX :: AX(char* cls) Init(cls); } - - void AX :: Clean() { if (Site.InPlace == true) @@ -422,9 +505,24 @@ HRESULT _stdcall AXClientSite :: Invoke( VARIANT FAR* pVarResult, EXCEPINFO FAR* pExcepInfo, unsigned int FAR* puArgErr) - { - return E_NOTIMPL; - } +{ + + if (m_lastExternalName==L"Insert") + { + + MessageBoxW(NULL, pDispParams->rgvarg->bstrVal,L"Add insert here...",MB_OK); + return S_OK; + } + else if (m_lastExternalName==L"Boop") + { + MessageBox(NULL, "BOOP", "Boopity boop",MB_OK); + } + else + { + return E_NOTIMPL; + } + return S_OK; +} void _stdcall AXClientSite :: OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed) @@ -531,7 +629,6 @@ LRESULT CALLBACK AXWndProc(HWND hh,UINT mm,WPARAM ww,LPARAM ll) return true; } - if (mm == AX_GETAXINTERFACE) { AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA); diff --git a/ax.h b/ax.h index e935a9b..6f56add 100644 --- a/ax.h +++ b/ax.h @@ -1,4 +1,6 @@ // AX.H +#include +#include // messages #define AX_QUERYINTERFACE (WM_USER + 1) @@ -9,7 +11,6 @@ #define AX_SETDATAADVISE (WM_USER + 6) #define AX_DOVERB (WM_USER + 7) - // Registration function ATOM AXRegister(); @@ -20,7 +21,8 @@ class AXClientSite : public IDispatch, public IAdviseSink, public IOleInPlaceSite, - public IOleInPlaceFrame + public IOleInPlaceFrame, + public IDocHostUIHandler { protected: @@ -28,7 +30,6 @@ class AXClientSite : public: - HWND Window; HWND Parent; HMENU Menu; @@ -55,7 +56,64 @@ class AXClientSite : STDMETHODIMP ShowObject(); STDMETHODIMP OnShowWindow(BOOL f); STDMETHODIMP RequestNewObjectLayout(); - + + // IDDocHandler methods + STDMETHODIMP ShowContextMenu( + /* [in] */ DWORD dwID, + /* [in] */ POINT *ppt, + /* [in] */ IUnknown *pcmdtReserved, + /* [in] */ IDispatch *pdispReserved); + + STDMETHODIMP GetHostInfo( + /* [out][in] */ DOCHOSTUIINFO *pInfo); + + STDMETHODIMP ShowUI( + /* [in] */ DWORD dwID, + /* [in] */ IOleInPlaceActiveObject *pActiveObject, + /* [in] */ IOleCommandTarget *pCommandTarget, + /* [in] */ IOleInPlaceFrame *pFrame, + /* [in] */ IOleInPlaceUIWindow *pDoc); + + STDMETHODIMP HideUI( void); + + STDMETHODIMP UpdateUI( void); + + STDMETHODIMP OnDocWindowActivate( + /* [in] */ BOOL fActivate); + + STDMETHODIMP OnFrameWindowActivate( + /* [in] */ BOOL fActivate); + + STDMETHODIMP ResizeBorder( + /* [in] */ LPCRECT prcBorder, + /* [in] */ IOleInPlaceUIWindow *pUIWindow, + /* [in] */ BOOL fRameWindow); + + STDMETHODIMP TranslateAccelerator( + /* [in] */ LPMSG lpMsg, + /* [in] */ const GUID *pguidCmdGroup, + /* [in] */ DWORD nCmdID); + + STDMETHODIMP GetOptionKeyPath( + /* [out] */ LPOLESTR *pchKey, + /* [in] */ DWORD dw); + + STDMETHODIMP GetDropTarget( + /* [in] */ IDropTarget *pDropTarget, + /* [out] */ IDropTarget **ppDropTarget); + + STDMETHODIMP GetExternal( + /* [out] */ IDispatch **ppDispatch); + + STDMETHODIMP TranslateUrl( + /* [in] */ DWORD dwTranslate, + /* [in] */ OLECHAR *pchURLIn, + /* [out] */ OLECHAR **ppchURLOut); + + STDMETHODIMP FilterDataObject( + /* [in] */ IDataObject *pDO, + /* [out] */ IDataObject **ppDORet); + // IAdviseSink methods STDMETHODIMP_(void) OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed); @@ -90,14 +148,13 @@ class AXClientSite : STDMETHODIMP EnableModeless(BOOL f); STDMETHODIMP TranslateAccelerator(LPMSG,WORD); - + std::wstring m_lastExternalName; + // IDispatch Methods HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo); HRESULT _stdcall GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo); HRESULT _stdcall GetIDsOfNames(REFIID riid,OLECHAR FAR* FAR*,unsigned int cNames,LCID lcid,DISPID FAR* ); HRESULT _stdcall Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS FAR* pDispParams,VARIANT FAR* pVarResult,EXCEPINFO FAR* pExcepInfo,unsigned int FAR* puArgErr); - - // IOleControlSite Methods }; @@ -127,13 +184,9 @@ class AX //AX_CONNECTSTRUCT* tcs; bool AddMenu; DWORD AdviseToken; - DWORD DAdviseToken[100]; - - - + DWORD DAdviseToken[100]; private: - CLSID clsid;