External function support added.

This commit is contained in:
MusicalProgrammer
2020-03-07 16:05:15 -05:00
parent 47857e3fd1
commit 94b787804d
3 changed files with 53 additions and 62 deletions

View File

@@ -62,56 +62,11 @@ bool IEBrowser::navigateSyncURL(wchar_t* url)
if (webBrowser) if (webBrowser)
{ {
webBrowser->Navigate(url,0,0,0,0); 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 else
{ {
MessageBox(NULL,"Cannot read IWebBrowser2...",(g_PlaceholderName+" Crash").c_str(),MB_OK); MessageBox(NULL,"Cannot read IWebBrowser2...",(g_PlaceholderName+" Crash").c_str(),MB_OK);
} }
return false; return false;
} }

52
ax.cpp
View File

@@ -11,7 +11,6 @@
#pragma warning (disable: 4244) #pragma warning (disable: 4244)
#pragma warning (disable: 4800) #pragma warning (disable: 4800)
// AXClientSite class // AXClientSite class
// ------- Implement member functions // ------- Implement member functions
AXClientSite :: AXClientSite() AXClientSite :: AXClientSite()
@@ -83,7 +82,14 @@ STDMETHODIMP AXClientSite :: GetDropTarget( IDropTarget *pDropTarget, IDropTarge
STDMETHODIMP AXClientSite :: GetExternal(IDispatch **ppDispatch) 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) STDMETHODIMP AXClientSite ::TranslateUrl( DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
@@ -330,12 +336,13 @@ HRESULT _stdcall AXClientSite :: GetTypeInfo(
HRESULT _stdcall AXClientSite :: GetIDsOfNames( HRESULT _stdcall AXClientSite :: GetIDsOfNames(
REFIID riid, REFIID riid,
OLECHAR FAR* FAR*, OLECHAR FAR* FAR* ext_function_name,
unsigned int cNames, unsigned int cNames,
LCID lcid, LCID lcid,
DISPID FAR* ) DISPID FAR* )
{ {
return E_NOTIMPL; m_lastExternalName = *ext_function_name;
return S_OK;
} }
@@ -355,7 +362,7 @@ void AX :: Init(char* cls)
AdviseToken = 0; AdviseToken = 0;
memset(DAdviseToken,0,sizeof(DAdviseToken)); memset(DAdviseToken,0,sizeof(DAdviseToken));
Site.ax = this; Site.ax = this;
m_externalDisp = 0;
} }
AX :: AX(char* cls) 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() void AX :: Clean()
{ {
@@ -501,9 +517,24 @@ HRESULT _stdcall AXClientSite :: Invoke(
VARIANT FAR* pVarResult, VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo, EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr) 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) 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; return true;
} }
if (mm == AX_SETEXTERNALDISP)
{
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);
ax->SetExternalDispatch((IDispatch*)ll);
}
if (mm == AX_GETAXINTERFACE) if (mm == AX_GETAXINTERFACE)
{ {

12
ax.h
View File

@@ -1,5 +1,6 @@
// AX.H // AX.H
#include <mshtmhst.h> #include <mshtmhst.h>
#include <string>
// messages // messages
#define AX_QUERYINTERFACE (WM_USER + 1) #define AX_QUERYINTERFACE (WM_USER + 1)
@@ -9,6 +10,7 @@
#define AX_DISCONNECTOBJECT (WM_USER + 5) #define AX_DISCONNECTOBJECT (WM_USER + 5)
#define AX_SETDATAADVISE (WM_USER + 6) #define AX_SETDATAADVISE (WM_USER + 6)
#define AX_DOVERB (WM_USER + 7) #define AX_DOVERB (WM_USER + 7)
#define AX_SETEXTERNALDISP (WM_USER + 8)
// Registration function // Registration function
@@ -30,7 +32,6 @@ class AXClientSite :
public: public:
HWND Window; HWND Window;
HWND Parent; HWND Parent;
HMENU Menu; HMENU Menu;
@@ -149,14 +150,13 @@ class AXClientSite :
STDMETHODIMP EnableModeless(BOOL f); STDMETHODIMP EnableModeless(BOOL f);
STDMETHODIMP TranslateAccelerator(LPMSG,WORD); STDMETHODIMP TranslateAccelerator(LPMSG,WORD);
std::wstring m_lastExternalName;
// IDispatch Methods // IDispatch Methods
HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo); HRESULT _stdcall GetTypeInfoCount(unsigned int * pctinfo);
HRESULT _stdcall GetTypeInfo(unsigned int iTInfo,LCID lcid,ITypeInfo FAR* FAR* ppTInfo); 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 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); 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; bool AddMenu;
DWORD AdviseToken; DWORD AdviseToken;
DWORD DAdviseToken[100]; DWORD DAdviseToken[100];
void SetExternalDispatch(IDispatch* externalDisp);
IDispatch* GetExternalDispatch();
private: private:
IDispatch* m_externalDisp;
CLSID clsid; CLSID clsid;