Leaked source code of windows server 2003
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.

163 lines
4.5 KiB

  1. // About.cpp : Implementation of CSnapInAbout
  2. #include "stdafx.h"
  3. #include "about.h"
  4. #include "util.h"
  5. #include <winver.h>
  6. //////////////////////////////////////////////////////////////////////////////////////////////
  7. //
  8. HRESULT CSnapInAbout::GetString( UINT nID, LPOLESTR* ppsz )
  9. {
  10. VALIDATE_POINTER(ppsz)
  11. USES_CONVERSION;
  12. tstring strTemp = StrLoadString(nID);
  13. if( strTemp.empty() ) return E_FAIL;
  14. *ppsz = reinterpret_cast<LPOLESTR>( CoTaskMemAlloc( (strTemp.length() + 1) * sizeof(OLECHAR)) );
  15. if( *ppsz == NULL ) return E_OUTOFMEMORY;
  16. ocscpy( *ppsz, T2OLE((LPTSTR)strTemp.c_str()) );
  17. return S_OK;
  18. }
  19. HRESULT CSnapInAbout::GetSnapinDescription( LPOLESTR* ppszDescr )
  20. {
  21. return GetString(IDS_SNAPIN_DESC, ppszDescr);
  22. }
  23. HRESULT CSnapInAbout::GetProvider( LPOLESTR* ppszName )
  24. {
  25. return GetString(IDS_COMPANY, ppszName);
  26. }
  27. HRESULT CSnapInAbout::GetSnapinVersion( LPOLESTR* ppszVersion )
  28. {
  29. if( !ppszVersion ) return E_INVALIDARG;
  30. USES_CONVERSION;
  31. TCHAR szBuf[MAX_PATH] = {0};
  32. DWORD dwLen = GetModuleFileName( _Module.GetModuleInstance(), szBuf, MAX_PATH );
  33. if( dwLen < MAX_PATH )
  34. {
  35. LPDWORD pTranslation = NULL;
  36. UINT uNumTranslation = 0;
  37. DWORD dwHandle = NULL;
  38. DWORD dwSize = GetFileVersionInfoSize(szBuf, &dwHandle);
  39. if( !dwSize ) return E_FAIL;
  40. BYTE* pVersionInfo = new BYTE[dwSize];
  41. if( !pVersionInfo ) return E_OUTOFMEMORY;
  42. if (!GetFileVersionInfo( szBuf, dwHandle, dwSize, pVersionInfo ) ||
  43. !VerQueryValue( (const LPVOID)pVersionInfo, _T("\\VarFileInfo\\Translation"), (LPVOID*)&pTranslation, &uNumTranslation ) ||
  44. !pTranslation )
  45. {
  46. delete [] pVersionInfo;
  47. pVersionInfo = NULL;
  48. pTranslation = NULL;
  49. uNumTranslation = 0;
  50. return E_FAIL;
  51. }
  52. uNumTranslation /= sizeof(DWORD);
  53. tstring strQuery = _T("\\StringFileInfo\\");
  54. // 8 characters for the language/char-set,
  55. // 1 for the slash,
  56. // 1 for terminating NULL
  57. TCHAR szTranslation[128] = {0};
  58. _sntprintf( szTranslation, 127, _T("%04x%04x\\"), LOWORD(*pTranslation), HIWORD(*pTranslation));
  59. strQuery += szTranslation;
  60. strQuery += _T("FileVersion");
  61. LPBYTE lpVerValue = NULL;
  62. UINT uSize = 0;
  63. if (!VerQueryValue(pVersionInfo, (LPTSTR)strQuery.c_str(), (LPVOID *)&lpVerValue, &uSize))
  64. {
  65. delete [] pVersionInfo;
  66. return E_FAIL;
  67. }
  68. // check the version
  69. _tcsncpy( szBuf, (LPTSTR)lpVerValue, MAX_PATH-1 );
  70. delete [] pVersionInfo;
  71. }
  72. *ppszVersion = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR));
  73. if( *ppszVersion == NULL ) return E_OUTOFMEMORY;
  74. ocscpy( *ppszVersion, T2OLE(szBuf) );
  75. return S_OK;
  76. }
  77. HRESULT CSnapInAbout::GetSnapinImage(HICON* phAppIcon)
  78. {
  79. VALIDATE_POINTER(phAppIcon)
  80. if( !m_hIcon )
  81. {
  82. m_hIcon = ::LoadIcon(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDI_APPL));
  83. }
  84. *phAppIcon = m_hIcon;
  85. return (m_hIcon ? S_OK : E_FAIL);
  86. }
  87. HRESULT CSnapInAbout::GetStaticFolderImage(HBITMAP* phSmallImage,
  88. HBITMAP* phSmallImageOpen,
  89. HBITMAP* phLargeImage,
  90. COLORREF* pcMask)
  91. {
  92. if( !phSmallImage || !phSmallImageOpen || !phLargeImage || !pcMask ) return E_POINTER;
  93. if( !(HBITMAP)m_bmpSmallImage )
  94. {
  95. CBitmap bmp16;
  96. if( bmp16.LoadBitmap(IDB_ROOT16) )
  97. {
  98. m_bmpSmallImage = GetBitmapFromStrip(bmp16, ROOT_NODE_IMAGE, 16);
  99. m_bmpSmallImageOpen = GetBitmapFromStrip(bmp16, ROOT_NODE_OPENIMAGE, 16);
  100. }
  101. }
  102. if( !(HBITMAP)m_bmpLargeImage )
  103. {
  104. CBitmap bmp32;
  105. if( bmp32.LoadBitmap(IDB_ROOT32) )
  106. {
  107. m_bmpLargeImage = GetBitmapFromStrip(bmp32, ROOT_NODE_IMAGE, 32);
  108. }
  109. }
  110. *phSmallImage = (HBITMAP)m_bmpSmallImage;
  111. *phSmallImageOpen = (HBITMAP)m_bmpSmallImageOpen;
  112. *phLargeImage = (HBITMAP)m_bmpLargeImage;
  113. *pcMask = RGB(255,0,255);
  114. return S_OK;
  115. }