#pragma once #include "ihost.h" #include "ithunk.h" #include "idsource.h" #include "iuiview.h" HRESULT SxApwHostCreateObject( REFCLSID rclsid, REFIID riid, DWORD dwFlags, void** pp ); /* an acceptable error from CreateActCtx */ BOOL SxApwIsErrorResourceNotFound( DWORD dwError ); class CSxApwActCtxHandle; class CSxApwActCtxScope; class CSxApwActCtxHandle : public CFusionActCtxHandle { private: typedef CFusionActCtxHandle Base; public: CSxApwActCtxHandle() { } CSxApwActCtxHandle(HANDLE handle) : Base(handle) { } ~CSxApwActCtxHandle() { } void operator=(HANDLE handle) { Base::operator=(handle); } HRESULT HrCreate(const std::wstring& dllPath) { HRESULT hr = S_OK; ACTCTXW actCtx; BOOL fResourceNotFound = FALSE; actCtx.cbSize = sizeof(actCtx); actCtx.dwFlags = ACTCTX_FLAG_RESOURCE_NAME_VALID; actCtx.lpResourceName = MAKEINTRESOURCE(3); // magic number actCtx.lpSource = dllPath.c_str(); IFFALSE_WIN32TOHR_EXIT(hr, Win32Create(&actCtx) || (fResourceNotFound = SxApwIsErrorResourceNotFound(::GetLastError()))); if (fResourceNotFound) Base::operator=(static_cast(NULL)); hr = S_OK; Exit: return hr; } }; template class CSxApwThunk { public: CSxApwThunk() { } ~CSxApwThunk() { //hack/leak/undone/garbage //if (m_actctxHandle != NULL) // SxApwReleaseActCtx(m_actctxHandle->GetCPlusPlusObject()); } STDMETHOD(InitThunk)( IUnknown* underlyingUnknown, HANDLE actctxHandle ) { m_underlying = underlyingUnknown; m_actctxHandle = actctxHandle; return S_OK; } protected: CSxApwComPtr m_underlying; CSxApwActCtxHandle m_actctxHandle; private: CSxApwThunk(const CSxApwThunk&); // intentially not implemented void operator=(const CSxApwThunk&); // intentially not implemented }; class __declspec(uuid(CLSID_CSxApwHostThunk_declspec_uuid)) CSxApwHostThunk : public ATL::CComObjectRootEx, public ATL::CComCoClass, public ISxApwHost, public ISxApwThunk, public CSxApwThunk { typedef CSxApwThunk CSxApwThunk; public: BEGIN_COM_MAP(CSxApwHostThunk) COM_INTERFACE_ENTRY(ISxApwHost) COM_INTERFACE_ENTRY(ISxApwThunk) COM_INTERFACE_ENTRY(CSxApwHostThunk) END_COM_MAP() DECLARE_NO_REGISTRY(); CSxApwHostThunk() { } ~CSxApwHostThunk() { } typedef ISxApwHost ThunkedInterface; STDMETHOD(InitThunk)( IUnknown* underlyingUnknown, HANDLE actctxHandle ) { return CSxApwThunk::InitThunk(underlyingUnknown, actctxHandle); } STDMETHOD(RunQuery)( LPCWSTR ); STDMETHOD(SetDataSource)( LPCWSTR ); STDMETHOD(CreateView)( LPCWSTR ); STDMETHOD(DestroyView)( LPCWSTR ); STDMETHOD(OnQueryDone)( ); STDMETHOD(InformSchema)( const SxApwColumnInfo rgColumnInfo[], int nColumns ); STDMETHOD(OnNextRow)( int nColumns, const LPCWSTR columns[] ); STDMETHOD(OnRowCountEstimateAvailable)( int nRowCountEstimate ); private: CSxApwHostThunk(const CSxApwHostThunk&); // intentially not implemented void operator=(const CSxApwHostThunk&); // intentially not implemented }; class __declspec(uuid(CLSID_CSxApwDataSourceThunk_declspec_uuid)) CSxApwDataSourceThunk : public ATL::CComObjectRootEx, public ATL::CComCoClass, public ISxApwDataSource, public ISxApwThunk, public CSxApwThunk { typedef CSxApwThunk CSxApwThunk; public: BEGIN_COM_MAP(CSxApwDataSourceThunk) COM_INTERFACE_ENTRY(ISxApwDataSource) COM_INTERFACE_ENTRY(ISxApwThunk) END_COM_MAP() DECLARE_NO_REGISTRY(); typedef ISxApwDataSource ThunkedInterface; CSxApwDataSourceThunk() { } ~CSxApwDataSourceThunk() { } STDMETHOD(InitThunk)( IUnknown* underlyingUnknown, HANDLE actctxHandle ) { return CSxApwThunk::InitThunk(underlyingUnknown, actctxHandle); } STDMETHOD(SetSite)( ISxApwHost* host ); STDMETHOD(RunQuery)( LPCWSTR query ); STDMETHOD(StopQuery)( ); private: CSxApwDataSourceThunk(const CSxApwDataSourceThunk&); // intentially not implemented void operator=(const CSxApwDataSourceThunk&); // intentially not implemented }; class __declspec(uuid(CLSID_CSxApwUiViewThunk_declspec_uuid)) CSxApwUiViewThunk : public ATL::CComObjectRootEx, public ATL::CComCoClass, public ISxApwUiView, public ISxApwThunk, public CSxApwThunk { typedef CSxApwThunk CSxApwThunk; public: typedef ISxApwUiView ThunkedInterface; BEGIN_COM_MAP(CSxApwUiViewThunk) COM_INTERFACE_ENTRY(ISxApwUiView) COM_INTERFACE_ENTRY(ISxApwThunk) END_COM_MAP() DECLARE_NO_REGISTRY(); CSxApwUiViewThunk() { } ~CSxApwUiViewThunk() { } STDMETHOD(InitThunk)( IUnknown* underlyingUnknown, HANDLE actctxHandle ) { return CSxApwThunk::InitThunk(underlyingUnknown, actctxHandle); } STDMETHOD(SetSite)( ISxApwHost* host ); STDMETHOD(CreateWindow)( HWND hWnd ); STDMETHOD(OnNextRow)( int nColumns, const LPCWSTR* prgszColumns ); STDMETHOD(OnRowCountEstimateAvailable)( int nRowCountEstimate ); STDMETHOD(OnQueryStart)( ); STDMETHOD(OnQueryDone)( ); STDMETHOD(InformSchema)( const SxApwColumnInfo rgColumnInfo[], int nColumns ); private: CSxApwUiViewThunk(const CSxApwUiViewThunk&); // intentially not implemented void operator=(const CSxApwUiViewThunk&); // intentially not implemented };