// DropButtonBHO.h : Declaration of the CDropButtonBHO
#pragma once
#include "resource.h" // main symbols
#include <ShlGuid.h>
#include <exdispid.h>
#include <mshtml.h>
#include <atlrx.h>
#include <Objsafe.h>
#include "DropButton.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif
// ����״̬�ı��־��
#define DISPID_WINDOWSTATECHANGED 283
// ����״̬����
typedef enum
{
OLECMDIDF_WINDOWSTATE_USERVISIBLE = 0x00000001,
OLECMDIDF_WINDOWSTATE_ENABLED = 0x00000002,
OLECMDIDF_WINDOWSTATE_USERVISIBLE_VALID = 0x00010000,
OLECMDIDF_WINDOWSTATE_ENABLED_VALID = 0x00020000,
} OLECMDID_WINDOWSTATE_FLAG;
// CDropButtonBHO
class ATL_NO_VTABLE CDropButtonBHO :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CDropButtonBHO, &CLSID_DropButtonBHO>,
public IObjectWithSiteImpl<CDropButtonBHO>,
public IDispatchImpl<IDropButtonBHO, &IID_IDropButtonBHO, &LIBID_DropButtonLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IDispEventImpl<1, CDropButtonBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>,
public IObjectSafety
{
public:
CDropButtonBHO();
DECLARE_REGISTRY_RESOURCEID(IDR_DROPBUTTONBHO)
// Message Map
BEGIN_COM_MAP(CDropButtonBHO)
COM_INTERFACE_ENTRY(IDropButtonBHO)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IObjectWithSite)
COM_INTERFACE_ENTRY(IObjectSafety)
END_COM_MAP()
BEGIN_SINK_MAP(CDropButtonBHO)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOWNLOADBEGIN, OnDownloadBegin)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOWNLOADCOMPLETE, OnDownloadComplete)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_PROGRESSCHANGE, OnProgressChange)
SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_WINDOWSTATECHANGED, OnWindowStateChanged)
END_SINK_MAP()
DECLARE_PROTECT_FINAL_CONSTRUCT()
// IObjectSafety implementation
STDMETHODIMP GetInterfaceSafetyOptions(REFIID riid, DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
{
ATLTRACE(_T("CDropButtonBHO::GetInterfaceSafetyOptions()\n"));
*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER | INTERFACESAFE_FOR_UNTRUSTED_DATA;
*pdwEnabledOptions = *pdwSupportedOptions;
return S_OK;
}
STDMETHODIMP SetInterfaceSafetyOptions(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions)
{
ATLTRACE(_T("CDropButtonBHO::SetInterfaceSafetyOptions\n"));
return S_OK;
}
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHOD(SetSite)(IUnknown *pUnkSite);
void STDMETHODCALLTYPE OnDocumentComplete(IDispatch *pDisp, VARIANT *pvarURL);
void STDMETHODCALLTYPE OnBeforeNavigate2( IDispatch *pDisp, VARIANT &url,
VARIANT &Flags, VARIANT &TargetFrameName,
VARIANT &PostData, VARIANT &Headers,
VARIANT_BOOL *Cancel);
void STDMETHODCALLTYPE OnDownloadBegin();
void STDMETHODCALLTYPE OnDownloadComplete();
void STDMETHODCALLTYPE OnWindowStateChanged(DWORD dwFlags, DWORD dwValidFlagsMask);
void STDMETHODCALLTYPE OnProgressChange(long nProgress, long nProgressMax);
private:
CComPtr<IWebBrowser2> m_spWebBrowser;
BOOL m_fAdvised;
BOOL m_isIE7;
private:
BOOL CheckIEVersion();
};
OBJECT_ENTRY_AUTO(__uuidof(DropButtonBHO), CDropButtonBHO)