From 94b787804df7d145e1cbd405a1e3517da822577a Mon Sep 17 00:00:00 2001 From: MusicalProgrammer Date: Sat, 7 Mar 2020 16:05:15 -0500 Subject: [PATCH] External function support added. --- IEBrowser.cpp | 47 +--------------------------------------------- ax.cpp | 52 +++++++++++++++++++++++++++++++++++++++++++-------- ax.h | 16 ++++++++-------- 3 files changed, 53 insertions(+), 62 deletions(-) diff --git a/IEBrowser.cpp b/IEBrowser.cpp index 97f1b3a..ea3f2cd 100644 --- a/IEBrowser.cpp +++ b/IEBrowser.cpp @@ -62,56 +62,11 @@ bool IEBrowser::navigateSyncURL(wchar_t* url) 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/ax.cpp b/ax.cpp index d602a04..91cfa4f 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() @@ -83,7 +82,14 @@ STDMETHODIMP AXClientSite :: GetDropTarget( IDropTarget *pDropTarget, IDropTarge STDMETHODIMP AXClientSite :: GetExternal(IDispatch **ppDispatch) { - return E_NOTIMPL; + //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) @@ -330,12 +336,13 @@ HRESULT _stdcall AXClientSite :: GetTypeInfo( 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; + m_lastExternalName = *ext_function_name; + return S_OK; } @@ -355,7 +362,7 @@ void AX :: Init(char* cls) AdviseToken = 0; memset(DAdviseToken,0,sizeof(DAdviseToken)); Site.ax = this; - + m_externalDisp = 0; } AX :: AX(char* cls) @@ -364,6 +371,15 @@ AX :: AX(char* cls) } +void AX :: SetExternalDispatch(IDispatch* externalDisp) +{ + m_externalDisp = externalDisp; +} + +IDispatch* AX :: GetExternalDispatch() +{ + return m_externalDisp; +} void AX :: Clean() { @@ -501,9 +517,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) @@ -610,6 +641,11 @@ LRESULT CALLBACK AXWndProc(HWND hh,UINT mm,WPARAM ww,LPARAM ll) return true; } + if (mm == AX_SETEXTERNALDISP) + { + AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA); + ax->SetExternalDispatch((IDispatch*)ll); + } if (mm == AX_GETAXINTERFACE) { diff --git a/ax.h b/ax.h index 1884d5b..e32ac9c 100644 --- a/ax.h +++ b/ax.h @@ -1,5 +1,6 @@ // AX.H #include +#include // messages #define AX_QUERYINTERFACE (WM_USER + 1) @@ -9,6 +10,7 @@ #define AX_DISCONNECTOBJECT (WM_USER + 5) #define AX_SETDATAADVISE (WM_USER + 6) #define AX_DOVERB (WM_USER + 7) +#define AX_SETEXTERNALDISP (WM_USER + 8) // Registration function @@ -30,7 +32,6 @@ class AXClientSite : public: - HWND Window; HWND Parent; HMENU Menu; @@ -149,14 +150,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 }; @@ -187,12 +187,12 @@ class AX bool AddMenu; DWORD AdviseToken; DWORD DAdviseToken[100]; - - - + void SetExternalDispatch(IDispatch* externalDisp); + IDispatch* GetExternalDispatch(); + private: - + IDispatch* m_externalDisp; CLSID clsid;