📄 browserwrapper.cpp
字号:
/*
This file is part of KCeasy (http://www.kceasy.com)
Copyright (C) 2002-2005 Markus Kern <mkern@kceasy.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "BrowserWrapper.h"
#include "BrowserUtils.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
TBrowserWrapper::TBrowserWrapper(TCppWebBrowser* Browser)
: RefCount(1),
WebBrowser(Browser),
External(NULL)
{
if(WebBrowser && WebBrowser->ControlInterface != ((IWebBrowser2*)NULL)) {
IOleObject *OleObject = NULL;
if(SUCCEEDED(WebBrowser->ControlInterface->QueryInterface(IID_IOleObject,
(void**)&OleObject)))
{
OleObject->SetClientSite(this);
OleObject->Release();
}
}
}
TBrowserWrapper::~TBrowserWrapper()
{
if(External)
External->Release();
}
TCppWebBrowser* TBrowserWrapper::GetBrowser()
{
return WebBrowser;
}
void TBrowserWrapper::SetExternal(IDispatch* Ext)
{
if(External)
External->Release();
External = Ext;
if(External)
External->AddRef();
}
IDispatch* TBrowserWrapper::GetExternal()
{
return External;
}
// IUnknown
HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryInterface(REFIID riid,
void** intf)
{
if(intf == NULL)
return E_POINTER;
*intf = NULL;
if(riid == IID_IUnknown)
*intf = (IUnknown*) ((IDocHostUIHandler*)this);
else if(riid == IID_IOleClientSite)
*intf = (IOleClientSite*) this;
else if(riid == IID_IDocHostUIHandler)
*intf = (IDocHostUIHandler*) this;
else if(riid == IID_IOleCommandTarget)
*intf = (IOleCommandTarget*) this;
else if(riid == IID_IInternetSecurityManager)
*intf = (IInternetSecurityManager*) this;
else if(riid == IID_IServiceProvider)
*intf = (IServiceProvider*) this;
if( *intf == NULL )
return E_NOINTERFACE;
AddRef();
return S_OK;
}
ULONG STDMETHODCALLTYPE TBrowserWrapper::AddRef()
{
InterlockedIncrement(&RefCount);
return RefCount;
}
ULONG STDMETHODCALLTYPE TBrowserWrapper::Release()
{
InterlockedDecrement(&RefCount);
if (RefCount == 0) {
delete this;
return 0;
}
return RefCount;
}
// IOleClientSite
HRESULT STDMETHODCALLTYPE TBrowserWrapper::SaveObject(void)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetMoniker(DWORD, DWORD,
IMoniker**)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetContainer(IOleContainer **)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::ShowObject(void)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::OnShowWindow(BOOL)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::RequestNewObjectLayout(void)
{
return E_NOTIMPL;
}
// IDocHostUIHandler
HRESULT STDMETHODCALLTYPE TBrowserWrapper::ShowContextMenu(DWORD, POINT*,
IUnknown*, IDispatch*)
{
/*
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/reference/ifaces/idochostuihandler/showcontextmenu.asp
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp
http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustompart2.asp
*/
#if 0
return S_OK; // don't show context menu in browser
#else
return E_NOTIMPL;
#endif
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetHostInfo(DOCHOSTUIINFO* pInfo)
{
pInfo->cbSize = sizeof(DOCHOSTUIINFO);
// allow text selection in browser
pInfo->dwFlags &= ~DOCHOSTUIFLAG_DIALOG;
// DOCHOSTUIFLAG_NO3DOUTERBORDER is only available on IE 6.0+
#define DOCHOSTUIFLAG_NO3DOUTERBORDER 0x00200000
pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DOUTERBORDER;
#undef DOCHOSTUIFLAG_NO3DOUTERBORDER
return S_OK;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::ShowUI(DWORD,
IOleInPlaceActiveObject*, IOleCommandTarget*, IOleInPlaceFrame*,
IOleInPlaceUIWindow*)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::HideUI(void)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::UpdateUI(void)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::EnableModeless(BOOL)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::OnDocWindowActivate(BOOL)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::OnFrameWindowActivate(BOOL)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::ResizeBorder(LPCRECT,
IOleInPlaceUIWindow*, BOOL)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::TranslateAccelerator(LPMSG lpMsg,
const GUID*, DWORD)
{
// This all is needed to make <enter> work in forms
if(lpMsg &&
(lpMsg->message == WM_KEYDOWN || lpMsg->message == WM_KEYUP) &&
(lpMsg->wParam == VK_RETURN || lpMsg->wParam == VK_EXECUTE))
{
// it was a bitch to figure this out
// http://community.borland.com/article/0,1410,6302,00.html
// http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&c2coff=1&th=736b4f1d8383d431&seekm=3a802ec0_2%40dnews&frame=off
HWND hwnd = WebBrowser->Handle;
if(!(hwnd = ::GetWindow(hwnd,GW_CHILD)))
return S_FALSE;
if(!(hwnd = ::GetWindow(hwnd,GW_CHILD)))
return S_FALSE;
::SendMessage(hwnd,lpMsg->message,lpMsg->wParam,lpMsg->lParam);
if(lpMsg->message == WM_KEYDOWN)
::SendMessage(hwnd,WM_CHAR,13,0);
return S_OK;
}
// let IE handle it
return S_FALSE;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetOptionKeyPath(LPOLESTR*, DWORD)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetDropTarget(IDropTarget*,
IDropTarget**)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetExternal(IDispatch** intf)
{
if(intf == NULL)
return E_POINTER;
// make sure currently loaded doc is safe
if(!UrlSafeForExternal(WebBrowser->LocationURL))
return E_NOTIMPL;
if(External) {
*intf = External;
(*intf)->AddRef();
return S_OK;
}
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::TranslateUrl(DWORD, OLECHAR*,
OLECHAR**)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::FilterDataObject(IDataObject*,
IDataObject**)
{
return E_NOTIMPL;
}
// IOleCommandTarget
HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryStatus(
const GUID *pguidCmdGroup, ULONG cCmds, OLECMD *prgCmds,
OLECMDTEXT *pCmdText)
{
return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::Exec(
const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
VARIANTARG *pvaIn, VARIANTARG *pvaOut)
{
if (nCmdID == ::OLECMDID_SHOWSCRIPTERROR)
{
// don't show error dialog but continue to run scripts
(*pvaOut).vt = VT_BOOL;
(*pvaOut).boolVal = VARIANT_TRUE;
return S_OK;
}
return OLECMDERR_E_NOTSUPPORTED;
}
// IInternetSecurityManager
HRESULT STDMETHODCALLTYPE TBrowserWrapper::SetSecuritySite (
IInternetSecurityMgrSite *pSite)
{
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetSecuritySite(
IInternetSecurityMgrSite **ppSite)
{
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::MapUrlToZone(LPCWSTR pwszUrl,
DWORD *pdwZone,DWORD dwFlags)
{
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetSecurityId(LPCWSTR pwszUrl,
BYTE *pbSecurityId, DWORD *pcbSecurityId, DWORD dwReserved)
{
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::ProcessUrlAction(LPCWSTR pwszUrl,
DWORD dwAction, BYTE __RPC_FAR *pPolicy, DWORD cbPolicy,
BYTE __RPC_FAR *pContext, DWORD cbContext, DWORD dwFlags,
DWORD dwReserved)
{
// allow running scripts from trusted urls
if(dwAction >= URLACTION_SCRIPT_MIN && dwAction <= URLACTION_SCRIPT_MAX) {
if(UrlSafeForExternal(pwszUrl)) {
if(cbPolicy >= sizeof (DWORD)) {
*(DWORD*)pPolicy = URLPOLICY_ALLOW;
return S_OK;
} else {
return S_FALSE;
}
}
}
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryCustomPolicy(LPCWSTR pwszUrl,
REFGUID guidKey, BYTE **ppPolicy, DWORD *pcbPolicy, BYTE *pContext,
DWORD cbContext, DWORD dwReserved)
{
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::SetZoneMapping(DWORD dwZone,
LPCWSTR lpszPattern, DWORD dwFlags)
{
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE TBrowserWrapper::GetZoneMappings(DWORD dwZone,
IEnumString **ppenumString, DWORD dwFlags)
{
return INET_E_DEFAULT_ACTION;
}
// IServiceProvider
HRESULT STDMETHODCALLTYPE TBrowserWrapper::QueryService(REFGUID guidService,
REFIID riid, void** ppvObject)
{
if (guidService == SID_SInternetSecurityManager &&
riid == IID_IInternetSecurityManager)
{
HRESULT hr = (HRESULT)this->QueryInterface(riid, ppvObject);
return hr;
}
else
{
*ppvObject = NULL;
}
return E_NOINTERFACE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -