239 lines
6.5 KiB
C++
239 lines
6.5 KiB
C++
// SnapinAbout.cpp : implementation file
|
|
//
|
|
|
|
#include "stdafx.h"
|
|
#include "SnapinAbout.h"
|
|
#include "FileVersion.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSnapinAbout
|
|
|
|
IMPLEMENT_DYNCREATE(CSnapinAbout, CCmdTarget)
|
|
|
|
CSnapinAbout::CSnapinAbout()
|
|
{
|
|
EnableAutomation();
|
|
|
|
// To keep the application running as long as an OLE automation
|
|
// object is active, the constructor calls AfxOleLockApp.
|
|
|
|
AfxOleLockApp();
|
|
}
|
|
|
|
CSnapinAbout::~CSnapinAbout()
|
|
{
|
|
// To terminate the application when all objects created with
|
|
// with OLE automation, the destructor calls AfxOleUnlockApp.
|
|
|
|
AfxOleUnlockApp();
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Overrideable Members
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
HRESULT CSnapinAbout::OnGetStaticFolderImage(HBITMAP __RPC_FAR * hSmallImage,HBITMAP __RPC_FAR * hSmallImageOpen,HBITMAP __RPC_FAR * hLargeImage,COLORREF __RPC_FAR * cMask)
|
|
{
|
|
TRACEX(_T("CSnapinAbout::OnGetStaticFolderImage\n"));
|
|
|
|
*hSmallImage = NULL;
|
|
*hSmallImageOpen = NULL;
|
|
*hLargeImage = NULL;
|
|
*cMask = NULL;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
void CSnapinAbout::OnGetSnapinDescription(CString& sDescription)
|
|
{
|
|
TRACEX(_T("CSnapinAbout::OnGetSnapinDescription\n"));
|
|
|
|
sDescription = _T("");
|
|
}
|
|
|
|
HRESULT CSnapinAbout::OnGetSnapinImage(HICON __RPC_FAR *hAppIcon)
|
|
{
|
|
TRACEX(_T("CSnapinAbout::OnGetSnapinImage\n"));
|
|
|
|
*hAppIcon = NULL;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
void CSnapinAbout::OnFinalRelease()
|
|
{
|
|
// When the last reference for an automation object is released
|
|
// OnFinalRelease is called. The base class will automatically
|
|
// deletes the object. Add additional cleanup required for your
|
|
// object before calling the base class.
|
|
|
|
CCmdTarget::OnFinalRelease();
|
|
}
|
|
|
|
|
|
BEGIN_MESSAGE_MAP(CSnapinAbout, CCmdTarget)
|
|
//{{AFX_MSG_MAP(CSnapinAbout)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
BEGIN_DISPATCH_MAP(CSnapinAbout, CCmdTarget)
|
|
//{{AFX_DISPATCH_MAP(CSnapinAbout)
|
|
// NOTE - the ClassWizard will add and remove mapping macros here.
|
|
//}}AFX_DISPATCH_MAP
|
|
END_DISPATCH_MAP()
|
|
|
|
// Note: we add support for IID_ISnapinAbout to support typesafe binding
|
|
// from VBA. This IID must match the GUID that is attached to the
|
|
// dispinterface in the .ODL file.
|
|
|
|
// {80F85331-AB10-11D2-BD62-0000F87A3912}
|
|
static const IID IID_ISnapInAbout =
|
|
{ 0x80f85331, 0xab10, 0x11d2, { 0xbd, 0x62, 0x0, 0x0, 0xf8, 0x7a, 0x39, 0x12 } };
|
|
|
|
BEGIN_INTERFACE_MAP(CSnapinAbout, CCmdTarget)
|
|
INTERFACE_PART(CSnapinAbout, IID_ISnapInAbout, Dispatch)
|
|
INTERFACE_PART(CSnapinAbout, IID_ISnapinAbout, SnapinAbout)
|
|
END_INTERFACE_MAP()
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// ISnapinAbout Interface Map
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
ULONG FAR EXPORT CSnapinAbout::XSnapinAbout::AddRef()
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
return pThis->ExternalAddRef();
|
|
}
|
|
|
|
ULONG FAR EXPORT CSnapinAbout::XSnapinAbout::Release()
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
return pThis->ExternalRelease();
|
|
}
|
|
|
|
HRESULT FAR EXPORT CSnapinAbout::XSnapinAbout::QueryInterface(
|
|
REFIID iid, void FAR* FAR* ppvObj)
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
|
|
}
|
|
|
|
HRESULT FAR EXPORT CSnapinAbout::XSnapinAbout::GetSnapinDescription(
|
|
/* [out] */ LPOLESTR __RPC_FAR *lpDescription)
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
TRACEX(_T("CSnapinAbout::XSnapinAbout::GetSnapinDescription\n"));
|
|
TRACEARGn(lpDescription);
|
|
|
|
TCHAR szFileName[_MAX_PATH];
|
|
GetModuleFileName(AfxGetInstanceHandle(),szFileName,_MAX_PATH);
|
|
|
|
CFileVersion fv;
|
|
|
|
fv.Open(szFileName);
|
|
|
|
CString sSnapInDescription;
|
|
pThis->OnGetSnapinDescription(sSnapInDescription);
|
|
|
|
CString sDescription = sSnapInDescription;
|
|
sDescription += _T("\r\n");
|
|
sDescription += fv.GetFileDescription();
|
|
sDescription += _T("\r\n");
|
|
sDescription += fv.GetLegalCopyright();
|
|
|
|
if( sDescription.IsEmpty() )
|
|
return S_OK;
|
|
|
|
LPVOID lpBuffer = CoTaskMemAlloc((sDescription.GetLength()+1)*sizeof(TCHAR));
|
|
CopyMemory(lpBuffer,sDescription,(sDescription.GetLength()+1)*sizeof(TCHAR));
|
|
*lpDescription = (TCHAR*)lpBuffer;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT FAR EXPORT CSnapinAbout::XSnapinAbout::GetProvider(
|
|
/* [out] */ LPOLESTR __RPC_FAR *lpName)
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
TRACEX(_T("CSnapinAbout::XSnapinAbout::GetProvider\n"));
|
|
TRACEARGn(lpName);
|
|
|
|
TCHAR szFileName[_MAX_PATH];
|
|
GetModuleFileName(AfxGetInstanceHandle(),szFileName,_MAX_PATH);
|
|
|
|
CFileVersion fv;
|
|
|
|
fv.Open(szFileName);
|
|
|
|
CString sProvider = fv.GetCompanyName();
|
|
if( sProvider.IsEmpty() )
|
|
return S_OK;
|
|
|
|
LPVOID lpBuffer = CoTaskMemAlloc((sProvider.GetLength()+1)*sizeof(TCHAR));
|
|
CopyMemory(lpBuffer,sProvider,(sProvider.GetLength()+1)*sizeof(TCHAR));
|
|
*lpName = (TCHAR*)lpBuffer;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT FAR EXPORT CSnapinAbout::XSnapinAbout::GetSnapinVersion(
|
|
/* [out] */ LPOLESTR __RPC_FAR *lpVersion)
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
TRACEX(_T("CSnapinAbout::XSnapinAbout::GetSnapinVersion\n"));
|
|
TRACEARGn(lpVersion);
|
|
|
|
TCHAR szFileName[_MAX_PATH];
|
|
GetModuleFileName(AfxGetInstanceHandle(),szFileName,_MAX_PATH);
|
|
|
|
CFileVersion fv;
|
|
|
|
fv.Open(szFileName);
|
|
|
|
CString sVersion = fv.GetFileVersion();
|
|
if( sVersion.IsEmpty() )
|
|
return S_OK;
|
|
|
|
LPVOID lpBuffer = CoTaskMemAlloc((sVersion.GetLength()+1)*sizeof(TCHAR));
|
|
CopyMemory(lpBuffer,sVersion,(sVersion.GetLength()+1)*sizeof(TCHAR));
|
|
*lpVersion = (TCHAR*)lpBuffer;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT FAR EXPORT CSnapinAbout::XSnapinAbout::GetSnapinImage(
|
|
/* [out] */ HICON __RPC_FAR *hAppIcon)
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
TRACEX(_T("CSnapinAbout::XSnapinAbout::GetSnapinImage\n"));
|
|
TRACEARGn(hAppIcon);
|
|
|
|
return pThis->OnGetSnapinImage(hAppIcon);
|
|
}
|
|
|
|
HRESULT FAR EXPORT CSnapinAbout::XSnapinAbout::GetStaticFolderImage(
|
|
/* [out] */ HBITMAP __RPC_FAR *hSmallImage,
|
|
/* [out] */ HBITMAP __RPC_FAR *hSmallImageOpen,
|
|
/* [out] */ HBITMAP __RPC_FAR *hLargeImage,
|
|
/* [out] */ COLORREF __RPC_FAR *cMask)
|
|
{
|
|
METHOD_PROLOGUE(CSnapinAbout, SnapinAbout)
|
|
TRACEX(_T("CSnapinAbout::XSnapinAbout::GetStaticFolderImage\n"));
|
|
TRACEARGn(hSmallImage);
|
|
TRACEARGn(hSmallImageOpen);
|
|
TRACEARGn(hLargeImage);
|
|
TRACEARGn(cMask);
|
|
|
|
return pThis->OnGetStaticFolderImage(hSmallImage,hSmallImageOpen,hLargeImage,cMask);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSnapinAbout message handlers
|