You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
401 lines
9.8 KiB
401 lines
9.8 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1994 - 1999.
|
|
//
|
|
// File: about.cxx
|
|
//
|
|
// Contents: Implementation of ISnapinAbout interface
|
|
//
|
|
// Classes: CSnapinAbout
|
|
//
|
|
// History: 2-09-1999 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include "headers.hxx"
|
|
#pragma hdrstop
|
|
|
|
#include <ntverp.h> // 602542-2002/04/16-JonN LVER_PRODUCTVERSION_STR
|
|
|
|
|
|
//============================================================================
|
|
//
|
|
// IUnknown implementation
|
|
//
|
|
//============================================================================
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::QueryInterface
|
|
//
|
|
// Synopsis: Return the requested interface
|
|
//
|
|
// History: 02-10-1999 DavidMun Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
CSnapinAbout::QueryInterface(
|
|
REFIID riid,
|
|
LPVOID *ppvObj)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// TRACE_METHOD(CSnapinAbout, QueryInterface);
|
|
|
|
do
|
|
{
|
|
if (NULL == ppvObj)
|
|
{
|
|
hr = E_INVALIDARG;
|
|
DBG_OUT_HRESULT(hr);
|
|
break;
|
|
}
|
|
|
|
if (IsEqualIID(riid, IID_IUnknown))
|
|
{
|
|
*ppvObj = (IUnknown*)(IPersistStream*)this;
|
|
}
|
|
else if (IsEqualIID(riid, IID_ISnapinAbout))
|
|
{
|
|
*ppvObj = (IUnknown*)(ISnapinAbout*)this;
|
|
}
|
|
else
|
|
{
|
|
hr = E_NOINTERFACE;
|
|
#if (DBG == 1)
|
|
LPOLESTR pwszIID;
|
|
StringFromIID(riid, &pwszIID);
|
|
Dbg(DEB_ERROR, "CSnapinAbout::QI no interface %ws\n", pwszIID);
|
|
CoTaskMemFree(pwszIID);
|
|
#endif // (DBG == 1)
|
|
}
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
*ppvObj = NULL;
|
|
break;
|
|
}
|
|
|
|
//
|
|
// If we got this far we are handing out a new interface pointer on
|
|
// this object, so addref it.
|
|
//
|
|
|
|
AddRef();
|
|
} while (0);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::AddRef
|
|
//
|
|
// Synopsis: Standard OLE
|
|
//
|
|
// History: 02-10-1999 DavidMun Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CSnapinAbout::AddRef()
|
|
{
|
|
return InterlockedIncrement((LONG *) &_cRefs);
|
|
}
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::Release
|
|
//
|
|
// Synopsis: Standard OLE
|
|
//
|
|
// History: 02-10-1999 DavidMun Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CSnapinAbout::Release()
|
|
{
|
|
ULONG cRefsTemp;
|
|
|
|
cRefsTemp = InterlockedDecrement((LONG *)&_cRefs);
|
|
|
|
if (0 == cRefsTemp)
|
|
{
|
|
delete this;
|
|
}
|
|
|
|
return cRefsTemp;
|
|
}
|
|
|
|
|
|
|
|
|
|
//============================================================================
|
|
//
|
|
// ISnapinAbout implementation
|
|
//
|
|
//============================================================================
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::GetSnapinDescription
|
|
//
|
|
// Synopsis: Return a copy of the description string.
|
|
//
|
|
// Arguments: [lpDescription] - filled with string
|
|
//
|
|
// Returns: S_OK or E_OUTOFMEMORY
|
|
//
|
|
// Modifies: *[lpDescription]
|
|
//
|
|
// History: 2-09-1999 DavidMun Created
|
|
//
|
|
// Notes: Caller must CoTaskMemFree returned string
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
CSnapinAbout::GetSnapinDescription(
|
|
LPOLESTR *lpDescription)
|
|
{
|
|
TRACE_METHOD(CSnapinAbout, GetSnapinDescription);
|
|
ASSERT(!IsBadWritePtr(lpDescription, sizeof(*lpDescription)));
|
|
|
|
WCHAR wzDescription[MAX_PATH];
|
|
|
|
LoadStr(IDS_SNAPIN_ABOUT_DESCRIPTION, wzDescription, ARRAYLEN(wzDescription));
|
|
return CoTaskDupStr(lpDescription, wzDescription);
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::GetProvider
|
|
//
|
|
// Synopsis: Return a copy of the provider string.
|
|
//
|
|
// Arguments: [lpName] - filled with string
|
|
//
|
|
// Returns: S_OK or E_OUTOFMEMORY
|
|
//
|
|
// Modifies: *[lpName]
|
|
//
|
|
// History: 2-09-1999 DavidMun Created
|
|
//
|
|
// Notes: Caller must CoTaskMemFree returned string
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
CSnapinAbout::GetProvider(
|
|
LPOLESTR *lpName)
|
|
{
|
|
TRACE_METHOD(CSnapinAbout, GetProvider);
|
|
ASSERT(!IsBadWritePtr(lpName, sizeof(*lpName)));
|
|
|
|
WCHAR wzProvider[MAX_PATH];
|
|
|
|
LoadStr(IDS_SNAPIN_ABOUT_PROVIDER_NAME, wzProvider, ARRAYLEN(wzProvider));
|
|
return CoTaskDupStr(lpName, wzProvider);
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::GetSnapinVersion
|
|
//
|
|
// Synopsis: Return a copy of the version string.
|
|
//
|
|
// Arguments: [lpVersion] - filled with string
|
|
//
|
|
// Returns: S_OK or E_OUTOFMEMORY
|
|
//
|
|
// Modifies: *[lpVersion]
|
|
//
|
|
// History: 2-09-1999 DavidMun Created
|
|
//
|
|
// Notes: Caller must CoTaskMemFree returned string
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
CSnapinAbout::GetSnapinVersion(
|
|
LPOLESTR *lpVersion)
|
|
{
|
|
TRACE_METHOD(CSnapinAbout, GetSnapinVersion);
|
|
ASSERT(!IsBadWritePtr(lpVersion, sizeof(*lpVersion)));
|
|
|
|
// 602542-2002/04/16-JonN
|
|
// If you store VER_PRODUCTVERSION_STR in a string resource,
|
|
// MUI breaks every time the version number is updated.
|
|
// Just keep this in the program data.
|
|
return CoTaskDupStr(lpVersion, LVER_PRODUCTVERSION_STR);
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::GetSnapinImage
|
|
//
|
|
// Synopsis: Fill *[phAppIcon] with the icon representing this snapin.
|
|
//
|
|
// History: 2-09-1999 DavidMun Created
|
|
//
|
|
// Notes: This icon is used in the About box invoked from the wizard.
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
CSnapinAbout::GetSnapinImage(
|
|
HICON *phAppIcon)
|
|
{
|
|
TRACE_METHOD(CSnapinAbout, GetSnapinImage);
|
|
|
|
ASSERT(!IsBadWritePtr(phAppIcon, sizeof(*phAppIcon)));
|
|
*phAppIcon = LoadIcon(g_hinst, MAKEINTRESOURCE(IDI_SNAPIN));
|
|
return *phAppIcon ? S_OK : HRESULT_FROM_LASTERROR;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::GetStaticFolderImage
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [phSmallImage] - filled with handle to small image
|
|
// [phSmallImageOpen] - filled with handle to small image
|
|
// [phLargeImage] - filled with handle to large image
|
|
// [pcMask] - filled with bitmap mask color
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Modifies: all out parameters
|
|
//
|
|
// History: 2-09-1999 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
CSnapinAbout::GetStaticFolderImage(
|
|
HBITMAP *phSmallImage,
|
|
HBITMAP *phSmallImageOpen,
|
|
HBITMAP *phLargeImage,
|
|
COLORREF *pcMask)
|
|
{
|
|
TRACE_METHOD(CSnapinAbout, GetStaticFolderImage);
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
do
|
|
{
|
|
*pcMask = BITMAP_MASK_COLOR;
|
|
*phSmallImage = NULL;
|
|
*phSmallImageOpen = NULL;
|
|
*phLargeImage = NULL;
|
|
|
|
*phSmallImage = LoadBitmap(g_hinst,
|
|
MAKEINTRESOURCE(IDB_STATIC_FOLDER_CLOSED));
|
|
|
|
if (!*phSmallImage)
|
|
{
|
|
hr = HRESULT_FROM_LASTERROR;
|
|
DBG_OUT_HRESULT(hr);
|
|
break;
|
|
}
|
|
|
|
*phSmallImageOpen = (HBITMAP)
|
|
LoadImage(g_hinst,
|
|
MAKEINTRESOURCE(IDB_STATIC_FOLDER_OPEN),
|
|
IMAGE_BITMAP,
|
|
0,
|
|
0,
|
|
0);
|
|
|
|
if (!*phSmallImageOpen)
|
|
{
|
|
hr = HRESULT_FROM_LASTERROR;
|
|
DBG_OUT_HRESULT(hr);
|
|
DeleteObject(*phSmallImage);
|
|
*phSmallImage = NULL;
|
|
break;
|
|
}
|
|
|
|
*phLargeImage = LoadBitmap(g_hinst, MAKEINTRESOURCE(IDB_32x32));
|
|
|
|
if (!*phLargeImage)
|
|
{
|
|
hr = HRESULT_FROM_LASTERROR;
|
|
DBG_OUT_HRESULT(hr);
|
|
DeleteObject(*phSmallImage);
|
|
*phSmallImage = NULL;
|
|
DeleteObject(*phSmallImageOpen);
|
|
*phSmallImageOpen = NULL;
|
|
break;
|
|
}
|
|
} while (0);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::CSnapinAbout
|
|
//
|
|
// Synopsis: ctor
|
|
//
|
|
// History: 2-10-1999 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
CSnapinAbout::CSnapinAbout():
|
|
_cRefs(1)
|
|
{
|
|
TRACE_CONSTRUCTOR(CSnapinAbout);
|
|
DEBUG_INCREMENT_INSTANCE_COUNTER(CSnapin);
|
|
}
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Member: CSnapinAbout::~CSnapinAbout
|
|
//
|
|
// Synopsis: dtor
|
|
//
|
|
// History: 2-10-1999 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
CSnapinAbout::~CSnapinAbout()
|
|
{
|
|
TRACE_DESTRUCTOR(CSnapinAbout);
|
|
DEBUG_DECREMENT_INSTANCE_COUNTER(CSnapin);
|
|
}
|
|
|
|
|