//+-------------------------------------------------------------------------- // // 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 // 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); }