windows-nt/Source/XPSP1/NT/shell/osshell/snapins/devmgr/snapin/about.cpp
2020-09-26 16:20:57 +08:00

224 lines
3.7 KiB
C++

/*++
Copyright (C) 1997-1999 Microsoft Corporation
Module Name:
about.cpp
Abstract:
This module implemets ISnapinAbout inteface(CDevMgrAbout class).
Author:
William Hsieh (williamh) created
Revision History:
--*/
#include "devmgr.h"
#include "about.h"
//
// IUnknown interface
//
ULONG
CDevMgrAbout::AddRef()
{
::InterlockedIncrement((LONG*)&m_Ref);
return m_Ref;
}
ULONG
CDevMgrAbout::Release()
{
::InterlockedDecrement((LONG*)&m_Ref);
if (!m_Ref)
{
delete this;
return 0;
}
return m_Ref;
}
STDMETHODIMP
CDevMgrAbout::QueryInterface(
REFIID riid,
void** ppv
)
{
if (!ppv)
{
return E_INVALIDARG;
}
HRESULT hr = S_OK;
if (IsEqualIID(riid, IID_IUnknown))
{
*ppv = (IUnknown*)this;
}
else if (IsEqualIID(riid, IID_ISnapinAbout))
{
*ppv = (ISnapinAbout*)this;
}
else
{
*ppv = NULL;
hr = E_NOINTERFACE;
}
if (SUCCEEDED(hr))
{
AddRef();
}
return hr;
}
// ISnapinAbout interface
STDMETHODIMP
CDevMgrAbout::GetSnapinDescription(
LPOLESTR *ppDescription
)
{
return LoadResourceOleString(IDS_PROGRAM_ABOUT, ppDescription);
}
STDMETHODIMP
CDevMgrAbout::GetProvider(
LPOLESTR *ppProvider
)
{
return LoadResourceOleString(IDS_PROGRAM_PROVIDER, ppProvider);
}
STDMETHODIMP
CDevMgrAbout::GetSnapinVersion(
LPOLESTR *ppVersion
)
{
return LoadResourceOleString(IDS_PROGRAM_VERSION, ppVersion);
}
STDMETHODIMP
CDevMgrAbout::GetSnapinImage(
HICON* phIcon
)
{
if (!phIcon)
{
return E_INVALIDARG;
}
*phIcon = ::LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_DEVMGR));
if (!*phIcon)
{
return E_OUTOFMEMORY;
}
return S_OK;
}
STDMETHODIMP
CDevMgrAbout::GetStaticFolderImage(
HBITMAP* phSmall,
HBITMAP* phSmallOpen,
HBITMAP* phLarge,
COLORREF* pcrMask
)
{
if (!phSmall || !phSmallOpen || !phLarge || !pcrMask)
{
return E_INVALIDARG;
}
*phSmall = ::LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_SYSDM16));
*phSmallOpen = ::LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_SYSDM16));
*phLarge =::LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_SYSDM32));
*pcrMask = RGB(255, 0, 255);
if (NULL == *phSmall || NULL == *phSmallOpen || NULL == *phLarge)
{
if (NULL != *phSmall)
{
::DeleteObject(*phSmall);
*phSmall = NULL;
}
if (NULL != *phSmallOpen)
{
::DeleteObject(*phSmallOpen);
*phSmallOpen = NULL;
}
if (NULL != *phLarge)
{
::DeleteObject(*phLarge);
*phLarge = NULL;
}
return E_OUTOFMEMORY;
}
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// private routine to allocate ole task memory and load the given resource
// string(indicated by its string id) to the allocated memory.
// INPUT:
// StringId -- the string resource id
// LPOLESTR* -- place holder to hold the ole string pointer
// OUTPUT:
// standard OLE HRESULT
HRESULT
CDevMgrAbout::LoadResourceOleString(
int StringId,
LPOLESTR* ppolestr
)
{
if (!ppolestr)
{
return E_INVALIDARG;
}
TCHAR Text[MAX_PATH];
// get the string
::LoadString(g_hInstance, StringId, Text, ARRAYLEN(Text));
try
{
*ppolestr = AllocOleTaskString(Text);
}
catch (CMemoryException* e)
{
e->Delete();
if (*ppolestr)
{
FreeOleTaskString(*ppolestr);
*ppolestr = NULL;
}
}
if (!*ppolestr)
{
return E_OUTOFMEMORY;
}
return S_OK;
}