254 lines
6.1 KiB
C++
254 lines
6.1 KiB
C++
#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<HANDLE>(NULL));
|
|
hr = S_OK;
|
|
Exit:
|
|
return hr;
|
|
}
|
|
};
|
|
|
|
template <typename T>
|
|
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<T> 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<CComSingleThreadModel>,
|
|
public ATL::CComCoClass<CSxApwHostThunk, &__uuidof(CSxApwHostThunk)>,
|
|
public ISxApwHost,
|
|
public ISxApwThunk,
|
|
public CSxApwThunk<ISxApwHost>
|
|
{
|
|
typedef CSxApwThunk<ISxApwHost> 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<CComSingleThreadModel>,
|
|
public ATL::CComCoClass<CSxApwDataSourceThunk, &__uuidof(CSxApwDataSourceThunk)>,
|
|
public ISxApwDataSource,
|
|
public ISxApwThunk,
|
|
public CSxApwThunk<ISxApwDataSource>
|
|
{
|
|
typedef CSxApwThunk<ISxApwDataSource> 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<CComSingleThreadModel>,
|
|
public ATL::CComCoClass<CSxApwUiViewThunk, &__uuidof(CSxApwUiViewThunk)>,
|
|
public ISxApwUiView,
|
|
public ISxApwThunk,
|
|
public CSxApwThunk<ISxApwUiView>
|
|
{
|
|
typedef CSxApwThunk<ISxApwUiView> 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
|
|
};
|