
type __VARIANT,2:word vt[4]: word boolVal:endtype
const OLECMDID_SHOWSCRIPTERROR = 40
const VARIANT_TRUE = -1
const E_NOINTERFACE = 0x80004002
const E_NOTIMPL = 0x80004001
const VT_BOOL	= 11
declare import, WriteProcessMemory(h:int,b:pointer,p:pointer,l:int,w:pointer),int
declare import, GetCurrentProcess(),int
declare import, IsEqualGUID(riid1:GUID, riid2:GUID),int
extern _IID_IOleCommandTarget as GUID



class CCommandTarget
	declare virtual QueryInterface(iid:GUID,ppvObject:pointer),int
	declare virtual AddRef()
	declare virtual Release()
	declare virtual QueryStatus(pguidCmdGroup:GUID, cCmds:int,prgCmds:pointer, pCmdText:pointer),int
	declare virtual Exec(pguidCmdGroup:GUID, nCmdID:int, nCmdexecopt:int, pvaIn:__VARIANT,pvaOut:__VARIANT),int
endclass


'----------------------------------------------------
' globals

CCommandTarget g_ccmdt ':' IOleCommandTarget manages special commands like OLECMDID_SHOWSCRIPTERROR
' the previous method
uint g_OriginalQueryInterface
declare t_OriginalQueryInterface(site:pointer,iid:GUID,ppvObject:pointer),int
declare CCommandTarget_vtable_()
extern _MyIOleInPlaceSiteTable as int ':' pointer to MyIOleInPlaceSite::QueryInterface


sub BrowserMakeSilent()
	' initialize the global class
	pointer temp
	int myQuery
	temp = &g_ccmdt
	*<pointer>temp = &CCommandTarget_vtable_

	myQuery = &BrowserQueryInterface
	g_OriginalQueryInterface = _MyIOleInPlaceSiteTable ':' copy pointer to _Site_QueryInterface@12
	WriteProcessMemory(GetCurrentProcess(), &_MyIOleInPlaceSiteTable, &myQuery, 4, NULL)
	return
endsub



' replaceent for MyIOleInPlaceSite::QueryInterface, we need to extern supported objects
sub BrowserQueryInterface(site:pointer,iid:GUID,ppvObject:pointer),int

	if (IsEqualGUID(iid, _IID_IOleCommandTarget))
		*<pointer>ppvObject = &g_ccmdt
		return 0
	endif
	return !<t_OriginalQueryInterface>g_OriginalQueryInterface(site, iid, ppvObject)
endsub

'--------------------------------------------------------
' CCommandTarget methods

sub CCommandTarget::QueryInterface(iid:GUID,ppvObject:pointer),int
	return E_NOINTERFACE
endsub

sub CCommandTarget::AddRef()
	return
endsub

sub CCommandTarget::QueryStatus(pguidCmdGroup:GUID, cCmds:int,prgCmds:pointer, pCmdText:pointer),int
	return E_NOTIMPL
endsub

sub CCommandTarget::Release()
	return
endsub

sub CCommandTarget::Exec(pguidCmdGroup:GUID, nCmdID:int, nCmdexecopt:int, pvaIn:__VARIANT,pvaOut:__VARIANT),int
	if (nCmdID = OLECMDID_SHOWSCRIPTERROR)
		pvaOut.boolVal = VARIANT_TRUE
		pvaOut.vt = VT_BOOL
	endif
	return 0
endsub
