Merge pull request #39 from Vulpovile/master

Add new items in master
This commit is contained in:
Vulpovile
2020-03-09 13:16:23 -07:00
committed by GitHub
4 changed files with 176 additions and 98 deletions

View File

@@ -9,10 +9,9 @@
#include "Globals.h" #include "Globals.h"
#include "ax.h" #include "ax.h"
//#include "IEDispatcher.h"
void IEBrowser::Boop(char* test) void IEBrowser::Boop(char* test)
{ {
// External functions may end up here in the future
} }
IEBrowser::IEBrowser(HWND attachHWnd) { IEBrowser::IEBrowser(HWND attachHWnd) {
@@ -26,7 +25,6 @@ IEBrowser::IEBrowser(HWND attachHWnd) {
} }
} }
hwnd = attachHWnd; hwnd = attachHWnd;
spDocument = 0;
webBrowser = 0; webBrowser = 0;
SendMessage(hwnd,AX_INPLACE,1,0); SendMessage(hwnd,AX_INPLACE,1,0);
SendMessage(hwnd,AX_QUERYINTERFACE,(WPARAM)&IID_IWebBrowser2,(LPARAM)&webBrowser); 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) bool IEBrowser::navigateSyncURL(wchar_t* url)
{ {
MSG messages; MSG messages;
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;
} }

View File

@@ -14,12 +14,4 @@ class IEBrowser {
private: private:
IWebBrowser2* webBrowser; IWebBrowser2* webBrowser;
HWND hwnd; 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);
}; };

121
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()
@@ -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 // IUnknown methods
STDMETHODIMP AXClientSite :: QueryInterface(REFIID iid,void**ppvObject) STDMETHODIMP AXClientSite :: QueryInterface(REFIID iid,void**ppvObject)
{ {
@@ -46,6 +122,8 @@ STDMETHODIMP AXClientSite :: QueryInterface(REFIID iid,void**ppvObject)
*ppvObject = (IOleInPlaceFrame*)this; *ppvObject = (IOleInPlaceFrame*)this;
if (iid == IID_IOleInPlaceUIWindow) if (iid == IID_IOleInPlaceUIWindow)
*ppvObject = (IOleInPlaceUIWindow*)this; *ppvObject = (IOleInPlaceUIWindow*)this;
if (iid == IID_IDocHostUIHandler)
*ppvObject = (IDocHostUIHandler*)this;
} }
//* Log Call //* Log Call
@@ -229,9 +307,9 @@ STDMETHODIMP AXClientSite :: SetActiveObject(IOleInPlaceActiveObject*pV,LPCOLEST
STDMETHODIMP AXClientSite :: SetStatusText(LPCOLESTR t) STDMETHODIMP AXClientSite :: SetStatusText(LPCOLESTR t)
{ {
return E_NOTIMPL; return E_NOTIMPL;
} }
STDMETHODIMP AXClientSite :: EnableModeless(BOOL f) STDMETHODIMP AXClientSite :: EnableModeless(BOOL f)
{ {
@@ -251,14 +329,21 @@ HRESULT _stdcall AXClientSite :: GetTypeInfoCount(
HRESULT _stdcall AXClientSite :: GetTypeInfo( HRESULT _stdcall AXClientSite :: GetTypeInfo(
unsigned int iTInfo, unsigned int iTInfo,
LCID lcid, LCID lcid,
ITypeInfo FAR* FAR* ppTInfo) {return E_NOTIMPL;} ITypeInfo FAR* FAR* ppTInfo)
{
return E_NOTIMPL;
}
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* ) {return E_NOTIMPL;} DISPID FAR* )
{
m_lastExternalName = *ext_function_name;
return S_OK;
}
// Other Methods // Other Methods
@@ -284,8 +369,6 @@ AX :: AX(char* cls)
Init(cls); Init(cls);
} }
void AX :: Clean() void AX :: Clean()
{ {
if (Site.InPlace == true) if (Site.InPlace == true)
@@ -422,9 +505,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)
@@ -531,7 +629,6 @@ LRESULT CALLBACK AXWndProc(HWND hh,UINT mm,WPARAM ww,LPARAM ll)
return true; return true;
} }
if (mm == AX_GETAXINTERFACE) if (mm == AX_GETAXINTERFACE)
{ {
AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA); AX* ax = (AX*)GetWindowLong(hh,GWL_USERDATA);

71
ax.h
View File

@@ -1,4 +1,6 @@
// AX.H // AX.H
#include <mshtmhst.h>
#include <string>
// messages // messages
#define AX_QUERYINTERFACE (WM_USER + 1) #define AX_QUERYINTERFACE (WM_USER + 1)
@@ -9,7 +11,6 @@
#define AX_SETDATAADVISE (WM_USER + 6) #define AX_SETDATAADVISE (WM_USER + 6)
#define AX_DOVERB (WM_USER + 7) #define AX_DOVERB (WM_USER + 7)
// Registration function // Registration function
ATOM AXRegister(); ATOM AXRegister();
@@ -20,7 +21,8 @@ class AXClientSite :
public IDispatch, public IDispatch,
public IAdviseSink, public IAdviseSink,
public IOleInPlaceSite, public IOleInPlaceSite,
public IOleInPlaceFrame public IOleInPlaceFrame,
public IDocHostUIHandler
{ {
protected: protected:
@@ -28,7 +30,6 @@ class AXClientSite :
public: public:
HWND Window; HWND Window;
HWND Parent; HWND Parent;
HMENU Menu; HMENU Menu;
@@ -56,6 +57,63 @@ class AXClientSite :
STDMETHODIMP OnShowWindow(BOOL f); STDMETHODIMP OnShowWindow(BOOL f);
STDMETHODIMP RequestNewObjectLayout(); 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 // IAdviseSink methods
STDMETHODIMP_(void) OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed); STDMETHODIMP_(void) OnDataChange(FORMATETC *pFormatEtc,STGMEDIUM *pStgmed);
@@ -90,14 +148,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
}; };
@@ -129,11 +186,7 @@ class AX
DWORD AdviseToken; DWORD AdviseToken;
DWORD DAdviseToken[100]; DWORD DAdviseToken[100];
private: private:
CLSID clsid; CLSID clsid;