WindowsXP-SP1/admin/activec/inc/axwin2.h
2020-09-30 16:53:49 +02:00

108 lines
3.6 KiB
C++

/*--------------------------------------------------------------------------*
*
* Microsoft Windows
* Copyright (C) Microsoft Corporation, 1999
*
* File: AxHostWindow2.h
*
* Contents: Header file for CAxWindowT2. Refer to MSJ, December 1999.
*
* History: 30-Nov-99 VivekJ Created
*
*--------------------------------------------------------------------------*/
#pragma once
#ifndef __AXWIN2_H__
#define __AXWIN2_H__
template <typename TBase = CWindow>
class CAxWindowT2 : public CAxWindowT<TBase>
{
public:
CAxWindowT2(HWND hwnd = 0) : CAxWindowT<TBase>(hwnd) {}
HRESULT CreateControl(LPCOLESTR lpszName, IStream* pStream = NULL, IUnknown** ppUnkContainer = NULL)
{
return CreateControlEx(lpszName, pStream, ppUnkContainer);
}
HRESULT CreateControl(DWORD dwResID, IStream* pStream = NULL, IUnknown** ppUnkContainer = NULL)
{
return CreateControlEx(dwResID, pStream, ppUnkContainer);
}
HRESULT CreateControlEx(DWORD dwResID, IStream* pStream = NULL,
IUnknown** ppUnkContainer = NULL, IUnknown** ppUnkControl = NULL,
REFIID iidSink = IID_NULL, IUnknown* punkSink = NULL)
{
TCHAR szModule[_MAX_PATH];
GetModuleFileName(_Module.GetModuleInstance(), szModule, _MAX_PATH);
CComBSTR bstrURL(OLESTR("res://"));
bstrURL.Append(szModule);
bstrURL.Append(OLESTR("/"));
TCHAR szResID[11];
wsprintf(szResID, _T("%0d"), dwResID);
bstrURL.Append(szResID);
return CreateControlEx(bstrURL, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink);
}
HRESULT CreateControlEx(LPCOLESTR lpszName, IStream* pStream = NULL,
IUnknown** ppUnkContainer = NULL, IUnknown** ppUnkControl = NULL,
REFIID iidSink = IID_NULL, IUnknown* punkSink = NULL)
{
ATLASSERT(::IsWindow(m_hWnd));
HRESULT hr = E_FAIL;
CComPtr<IAxWinHostWindow> spAxWindow;
// Reuse existing CAxHostWindow
hr = QueryHost(&spAxWindow);
if( SUCCEEDED(hr) )
{
CComPtr<IUnknown> spunkControl;
hr = spAxWindow->CreateControlEx(lpszName, m_hWnd, pStream, &spunkControl, iidSink, punkSink);
if( FAILED(hr) ) return hr;
if( ppUnkControl ) (*ppUnkControl = spunkControl)->AddRef();
if( ppUnkContainer ) (*ppUnkContainer = spAxWindow)->AddRef();
}
// Create a new CAxHostWindow
else
{
return AtlAxCreateControlEx(lpszName, m_hWnd, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink);
}
return S_OK;
}
HRESULT AttachControl(IUnknown* pControl, IUnknown** ppUnkContainer = 0)
{
ATLASSERT(::IsWindow(m_hWnd));
HRESULT hr = E_FAIL;
CComPtr<IAxWinHostWindow> spAxWindow;
// Reuse existing CAxHostWindow
hr = QueryHost(&spAxWindow);
if( SUCCEEDED(hr) )
{
hr = spAxWindow->AttachControl(pControl, m_hWnd);
if( FAILED(hr) ) return hr;
if( ppUnkContainer ) (*ppUnkContainer = spAxWindow)->AddRef();
}
// Create a new CAxHostWindow
else
{
return AtlAxAttachControl(pControl, m_hWnd, ppUnkContainer);
}
return S_OK;
}
};
typedef CAxWindowT2<CWindow> CAxWindow2;
#endif // __AXWIN2_H__