1 #include "../StdAfx.h"
\r
3 #include "XcpControlHost.h"
\r
4 #include "XcpPropertyBag.h"
\r
6 #include "xcpctrl_h.h"
\r
10 using namespace ATL;
\r
13 #pragma warning (disable : 4100)
\r
14 #pragma warning(disable:4061)
\r
17 XcpControlHost::XcpControlHost()
\r
18 : hControlWindow(nullptr)
\r
19 , m_pUnKnown(nullptr)
\r
20 , m_pControl(nullptr)
\r
24 XcpControlHost::~XcpControlHost()
\r
28 STDMETHODIMP XcpControlHost::GetHostOptions(DWORD* pdwOptions)
\r
30 *pdwOptions = XcpHostOption_EnableCrossDomainDownloads|
\r
31 XcpHostOption_EnableScriptableObjectAccess|XcpHostOption_EnableHtmlDomAccess;
\r
35 STDMETHODIMP XcpControlHost::GetCustomAppDomain(IUnknown** ppAppDomain)
\r
40 STDMETHODIMP XcpControlHost::GetControlVersion(UINT *puMajorVersion, UINT *puMinorVersion)
\r
42 *puMajorVersion = 4;
\r
43 *puMinorVersion = 50401;
\r
47 STDMETHODIMP XcpControlHost::NotifyLoaded()
\r
49 // MessageBox(L"Notify Loaded", L"Silverlight Error", 0);
\r
53 STDMETHODIMP XcpControlHost::NotifyError(BSTR bstrError, BSTR bstrSource, long nLine, long nColumn)
\r
58 STDMETHODIMP XcpControlHost::InvokeHandler(BSTR bstrName, VARIANT varParam1, VARIANT varParam2, VARIANT* pvarResult)
\r
63 STDMETHODIMP XcpControlHost::GetBaseUrl(BSTR* pbstrUrl) {
\r
65 CAtlString strPath = "C:\\";
\r
67 //GetCurrentDirectory(255, pBuff);
\r
71 *pbstrUrl = SysAllocString(strPath);
\r
73 //MessageBox(*pbstrUrl, L"GetBaseUrl", 0);
\r
77 STDMETHODIMP XcpControlHost::GetNamedSource(BSTR bstrSourceName, BSTR* pbstrSource)
\r
82 STDMETHODIMP XcpControlHost::DownloadUrl(BSTR bstrUrl, IXcpControlDownloadCallback* pCallback, IStream** ppStream)
\r
84 // MessageBox(L"DownloadUrl", L"DownloadUrl", 0);
\r
88 ///////////////////////////////////////////////////////////////////////////////
\r
89 // XcpControlHost IServiceProvider Implementation
\r
91 STDMETHODIMP XcpControlHost::QueryService(REFGUID rsid, REFIID riid, void** ppvObj) {
\r
92 ATLASSERT(ppvObj != NULL);
\r
97 //static const GUID IID_IXcpControlHost =
\r
98 // { 0x1B36028E, 0xB491, 0x4bb2, { 0x85, 0x84, 0x8A, 0x9E, 0x0A, 0x67, 0x7D, 0x6E }};
\r
100 HRESULT hr = E_NOINTERFACE;
\r
102 if ((rsid == IID_IXcpControlHost) && (riid == IID_IXcpControlHost)) {
\r
103 ((IXcpControlHost*)this)->AddRef();
\r
104 *ppvObj = (IXcpControlHost*)this;
\r
108 if ((rsid == IID_IXcpControlHost2) && (riid == IID_IXcpControlHost2)) {
\r
109 ((IXcpControlHost2*)this)->AddRef();
\r
110 *ppvObj = (IXcpControlHost2*)this;
\r
118 ///////////////////////////////////////////////////////////////////////////////
\r
119 // General ActiveX control embedding.
\r
122 HRESULT XcpControlHost::CreateXcpControl(HWND hWnd)
\r
127 static const GUID IID_IXcpControl =
\r
128 { 0x1FB839CC, 0x116C, 0x4C9B, { 0xAE, 0x8E, 0x3D, 0xBB, 0x64, 0x96, 0xE3, 0x26 }};
\r
130 static const GUID CLSID_XcpControl =
\r
131 { 0xDFEAF541, 0xF3E1, 0x4c24, { 0xAC, 0xAC, 0x99, 0xC3, 0x07, 0x15, 0x08, 0x4A }};
\r
133 static const GUID IID_IXcpControl2 =
\r
134 { 0x1c3294f9, 0x891f, 0x49b1, { 0xBB, 0xAE, 0x49, 0x2a, 0x68, 0xBA, 0x10, 0xcc }};
\r
136 // static const GUID CLSID_XcpControl2 =
\r
137 // { 0xDFEAF541, 0xF3E1, 0x4c24, { 0xAC, 0xAC, 0x99, 0xC3, 0x07, 0x15, 0x08, 0x4A }};
\r
139 //static const GUID IID_IXcpControlHost2 =
\r
140 // { 0xfb3ed7c4, 0x5797, 0x4b44, { 0x86, 0x95, 0x0c, 0x51, 0x2e, 0xa2, 0x7D, 0x8f }};
\r
142 hr = CoCreateInstance(CLSID_XcpControl, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&m_pUnKnown);
\r
144 if (SUCCEEDED(hr))
\r
146 CComPtr<IUnknown> spUnkContainer;
\r
147 hr = XcpControlHost::_CreatorClass::CreateInstance(NULL, IID_IUnknown, (void**)&spUnkContainer);
\r
148 if (SUCCEEDED(hr))
\r
150 CComPtr<IAxWinHostWindow> pAxWindow;
\r
152 spUnkContainer->QueryInterface(IID_IAxWinHostWindow, (void**)&pAxWindow);
\r
153 m_pUnKnown->QueryInterface(IID_IXcpControl2, (void**)&m_pControl);
\r
154 hr = pAxWindow->AttachControl(m_pUnKnown, hWnd);
\r
155 hControlWindow = hWnd;
\r
157 IOleInPlaceActiveObject *pObj;
\r
158 hr = m_pControl->QueryInterface(IID_IOleInPlaceActiveObject, (void**)&pObj);
\r
164 HRESULT XcpControlHost::DestroyXcpControl()
\r
169 m_pControl->Release();
\r
173 m_pUnKnown->Release();
\r
179 STDMETHODIMP XcpControlHost::AttachControl(IUnknown* pUnKnown, HWND hWnd) {
\r
182 HRESULT hr = S_FALSE;
\r
183 BOOL fReleaseWindowOnFailure = FALSE;
\r
185 if ((m_hWnd != NULL) && (m_hWnd != hWnd)) {
\r
186 // Don't release the window if it's the same as the one we already subclass/own
\r
187 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
\r
191 if (::IsWindow(hWnd)) {
\r
192 if (m_hWnd != hWnd) {
\r
193 // Don't need to subclass the window if we already own it
\r
194 SubclassWindow(hWnd);
\r
195 fReleaseWindowOnFailure = TRUE;
\r
198 hr = ActivateXcpControl(pUnKnown);
\r
202 if (m_hWnd != NULL) {
\r
203 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
\r
205 if (fReleaseWindowOnFailure) {
\r
206 // We subclassed the window in an attempt to create this control, so we unsubclass on failure
\r
215 HRESULT XcpControlHost::ActivateXcpControl(IUnknown* pUnKnown)
\r
217 if (pUnKnown == NULL)
\r
222 m_spUnknown = pUnKnown;
\r
225 pUnKnown->QueryInterface(__uuidof(IOleObject), (void**)&m_spOleObject);
\r
226 if (m_spOleObject)
\r
228 m_spOleObject->GetMiscStatus(DVASPECT_CONTENT, &m_dwMiscStatus);
\r
229 if (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST)
\r
231 CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());
\r
232 m_spOleObject->SetClientSite(spClientSite);
\r
235 CComQIPtr<IPersistPropertyBag> pPersist(m_spOleObject);
\r
237 if (pPersist != NULL)
\r
239 IPropertyBag* pPropBag = new XcpPropertyBag();
\r
240 pPropBag->AddRef();
\r
242 pPersist->Load((IPropertyBag*)pPropBag, NULL);
\r
243 pPropBag->Release();
\r
246 if (0 == (m_dwMiscStatus & OLEMISC_SETCLIENTSITEFIRST))
\r
248 CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());
\r
249 m_spOleObject->SetClientSite(spClientSite);
\r
252 m_dwViewObjectType = 0;
\r
253 hr = m_spOleObject->QueryInterface(__uuidof(IViewObjectEx), (void**) &m_spViewObject);
\r
256 hr = m_spOleObject->QueryInterface(__uuidof(IViewObject2), (void**) &m_spViewObject);
\r
257 if (SUCCEEDED(hr)) {
\r
258 m_dwViewObjectType = 3;
\r
262 m_dwViewObjectType = 7;
\r
267 hr = m_spOleObject->QueryInterface(__uuidof(IViewObject), (void**) &m_spViewObject);
\r
269 m_dwViewObjectType = 1;
\r
272 CComQIPtr<IAdviseSink> spAdviseSink(GetControllingUnknown());
\r
273 m_spOleObject->Advise(spAdviseSink, &m_dwOleObject);
\r
274 if (m_spViewObject)
\r
276 m_spViewObject->SetAdvise(DVASPECT_CONTENT, 0, spAdviseSink);
\r
279 m_spOleObject->SetHostNames(OLESTR("AXWIN"), NULL);
\r
281 if ((m_dwMiscStatus & OLEMISC_INVISIBLEATRUNTIME) == 0)
\r
283 GetClientRect(&m_rcPos);
\r
285 m_pxSize.cx = m_rcPos.right - m_rcPos.left;
\r
286 m_pxSize.cy = m_rcPos.bottom - m_rcPos.top;
\r
287 AtlPixelToHiMetric(&m_pxSize, &m_hmSize);
\r
288 m_spOleObject->SetExtent(DVASPECT_CONTENT, &m_hmSize);
\r
289 m_spOleObject->GetExtent(DVASPECT_CONTENT, &m_hmSize);
\r
290 AtlHiMetricToPixel(&m_hmSize, &m_pxSize);
\r
291 m_rcPos.right = m_rcPos.left + m_pxSize.cx ;
\r
292 m_rcPos.bottom = m_rcPos.top + m_pxSize.cy ;
\r
294 CComQIPtr<IOleClientSite> spClientSite(GetControllingUnknown());
\r
295 hr = m_spOleObject->DoVerb(OLEIVERB_INPLACEACTIVATE, NULL, spClientSite, 0, m_hWnd, &m_rcPos);
\r
296 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE | RDW_INTERNALPAINT | RDW_FRAME);
\r
300 CComPtr<IObjectWithSite> spSite;
\r
301 pUnKnown->QueryInterface(__uuidof(IObjectWithSite), (void**)&spSite);
\r
302 if (spSite != NULL)
\r
304 spSite->SetSite(GetControllingUnknown());
\r