soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SAxContainer.cpp
1#if defined(_WIN32) && !defined(__MINGW32__)
2#include "souistd.h"
3#include "SAxContainer.h"
4
5SNSBEGIN
6
8 : m_lRefCnt(1)
9{
10}
11
13{
14}
15
16BOOL SAxContainer::CreateControl(REFGUID clsid, DWORD dwClsCtx /*=CLSCTX_INPROC_SERVER*/)
17{
18 SASSERT(m_pAxHostDelegate);
19 HRESULT hr = E_FAIL;
20 SComPtr<IUnknown> pControl;
21 hr = CoCreateInstance(clsid, NULL, dwClsCtx, __uuidof(IUnknown), reinterpret_cast<void **>(&pControl));
22 if (SUCCEEDED(hr))
23 {
24 Init(pControl);
25 }
26 return SUCCEEDED(hr);
27}
28
29///////////////////////////////////////////////////////////////////////////////
30// IUnknown
31HRESULT SAxContainer::QueryInterface(REFIID iid, void **object)
32{
33 HRESULT hr = S_OK;
34 *object = NULL;
35 if (iid == IID_IUnknown)
36 {
37 // Avoid ambiguous resolution of IUnknown
38 *object = static_cast<IUnknown *>(static_cast<MinimumIDispatchImpl *>(this));
39 }
40 else if (iid == IID_IDispatch)
41 {
42 *object = static_cast<MinimumIDispatchImpl *>(this);
43 }
44 else if (iid == IID_IOleContainer)
45 {
46 *object = static_cast<IOleContainer *>(this);
47 }
48 else if (iid == IID_IParseDisplayName)
49 {
50 *object = static_cast<IParseDisplayName *>(this);
51 }
52 else if (iid == IID_IBindHost)
53 {
54 *object = static_cast<IBindHost *>(this);
55 }
56 else if (iid == IID_IServiceProvider)
57 {
58 *object = static_cast<IServiceProvider *>(this);
59 }
60 else
61 {
62 hr = ActiveXSite::QueryInterface2(iid, object);
63 }
64 if (SUCCEEDED(hr))
65 {
66 static_cast<IUnknown *>(*object)->AddRef();
67 }
68 return hr;
69}
70
71ULONG STDMETHODCALLTYPE SAxContainer::AddRef()
72{
73 return ::InterlockedIncrement(&m_lRefCnt);
74}
75
76ULONG STDMETHODCALLTYPE SAxContainer::Release()
77{
78 // We don't destroy object when it reaches 0
79 return ::InterlockedDecrement(&m_lRefCnt);
80}
81
82///////////////////////////////////////////////////////////////////////////////
83// IBindHost
84HRESULT SAxContainer::CreateMoniker(LPOLESTR szName, IBindCtx * /*pBC*/, IMoniker **ppmk, DWORD /*dwReserved*/)
85{
86 HRESULT hr;
87 typedef HRESULT(WINAPI * pfnCreateURLMonikerEx)(IMoniker * pMkCtx, LPCWSTR szURL, IMoniker * *ppmk, DWORD dwFlags);
88 HMODULE urlmon = ::GetModuleHandleA("urlmon.dll");
89 if (!urlmon)
90 urlmon = ::LoadLibraryA("urlmon.dll");
91 pfnCreateURLMonikerEx OrigCreateURLMonikerEx = (pfnCreateURLMonikerEx)::GetProcAddress(urlmon, "CreateURLMonikerEx");
92 hr = OrigCreateURLMonikerEx(NULL, szName, ppmk, URL_MK_UNIFORM);
93 return hr;
94}
95
96HRESULT SAxContainer::MonikerBindToStorage(IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
97{
98 HRESULT hr = E_FAIL;
99 SComPtr<IBindCtx> pBCCtx = pBC;
100 if (pBCCtx == NULL)
101 {
102 // creates it if not present
103 hr = CreateBindCtx(0, &pBCCtx);
104 }
105
106 if (pBCCtx != NULL)
107 {
108 if (pBSC != NULL)
109 {
110 typedef HRESULT(WINAPI * pfnRegisterBindStatusCallback)(IBindCtx * pbc, IBindStatusCallback * pbsc, IBindStatusCallback * *ppbscPrevious, DWORD dwReserved);
111 HMODULE urlmon = ::GetModuleHandleA("urlmon.dll");
112 if (!urlmon)
113 urlmon = ::LoadLibraryA("urlmon.dll");
114 pfnRegisterBindStatusCallback OrigRegisterBindStatusCallback = (pfnRegisterBindStatusCallback)::GetProcAddress(urlmon, "RegisterBindStatusCallback");
115 hr = OrigRegisterBindStatusCallback(pBCCtx, pBSC, NULL, 0);
116 }
117 hr = pMk->BindToStorage(pBCCtx, NULL, riid, ppvObj);
118 }
119 return hr;
120}
121
122HRESULT SAxContainer::MonikerBindToObject(IMoniker * /*pMk*/, IBindCtx * /*pBC*/, IBindStatusCallback * /*pBSC*/, REFIID /*riid*/, void ** /*ppvObj*/)
123{
124 ATLTRACENOTIMPL(_T("ActiveXContainerImpl::MonikerBindToObject\n"));
125}
126
127// {0002DF05-0000-0000-C000-000000000046}
128static const GUID GUID_IWebBrowserApp = { 0x0002DF05, 0x0000, 0x0000, { 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 } };
129
130// {1B36028E-B491-4BB2-8584-8A9E0A677D6E}
131static const GUID GUID_IXcpControlHost = { 0x1B36028E, 0xB491, 0x4BB2, { 0x85, 0x84, 0x8A, 0x9E, 0x0A, 0x67, 0x7D, 0x6E } };
132
133HRESULT SAxContainer::QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
134{
135 HRESULT hr = E_FAIL;
136 if (guidService == IID_IBindHost || guidService == GUID_IWebBrowserApp || guidService == GUID_IXcpControlHost)
137 {
138 hr = QueryInterface(riid, ppvObject);
139 }
140 return hr;
141}
142
143SNSEND
144
145#endif // defined(_WIN32) && !defined(__MINGW32__)
Header file for ActiveX container implementation.
void Init(IUnknown *pControl)
STDMETHOD QueryInterface2(REFIID iid, void **object)
Query for an interface.
ULONG AddRef()
Increment the reference count.
ULONG Release()
Decrement the reference count.
BOOL CreateControl(REFGUID guid, DWORD dwClsCtx=CLSCTX_INPROC_SERVER)
Create an ActiveX control.
SAxContainer()
Constructor for SAxContainer.
STDMETHOD MonikerBindToObject(IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
Bind a moniker to an object.
STDMETHOD CreateMoniker(LPOLESTR szName, IBindCtx *pBC, IMoniker **ppmk, DWORD dwReserved)
Create a moniker from a display name.
STDMETHOD QueryService(REFGUID guidService, REFIID riid, void **ppvObject)
Query for a service.
STDMETHOD MonikerBindToStorage(IMoniker *pMk, IBindCtx *pBC, IBindStatusCallback *pBSC, REFIID riid, void **ppvObj)
Bind a moniker to a storage object.
virtual ~SAxContainer()
Destructor for SAxContainer.
STDMETHOD QueryInterface(REFIID iid, void **object)
Query for an interface.