⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 atlshellextbase.h

📁 remote debug and compile tools
💻 H
字号:
#ifndef __ATLSHELLEXTBASE_H__
#define __ATLSHELLEXTBASE_H__

#pragma once
//
// Written by Bjarke Viksoe (bjarke@viksoe.dk)
// Copyright (c) 2001 Bjarke Viksoe.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed by any means PROVIDING it is 
// not sold for profit without the authors written consent, and 
// providing that this notice and the authors name is included. 
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage to you or your
// computer whatsoever. It's free, so don't hassle me about it.
//
// Beware of bugs.
//

#ifndef __cplusplus
   #error ATL requires C++ compilation (use a .cpp suffix)
#endif

#ifndef __ATLBASE_H__
   #error atlshellbase.h requires atlbase.h to be included first
#endif

#include <shlobj.h>
#include <shlguid.h> 
#include <shellapi.h>

#include <commctrl.h>

#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "comctl32.lib")


class CShellMalloc
{
public:
   LPMALLOC m_pMalloc;
   void Init()
   {
      m_pMalloc = NULL;
      // It is safe to call ::SHGetMalloc()/::CoGetMalloc() without
      // first calling ::CoInitialize() according to MSDN.
      if( FAILED( ::SHGetMalloc(&m_pMalloc) ) ) {
         // TODO: TERMINATE
      }
   }
   void Term()
   {
      if( m_pMalloc!=NULL ) m_pMalloc->Release();
   }
   operator LPMALLOC() const
   {
      return m_pMalloc;
   }
   LPVOID Alloc(ULONG cb)
   {
      ATLASSERT(m_pMalloc!=NULL);
      ATLASSERT(cb>0);
      return m_pMalloc->Alloc(cb);
   }
   void Free(LPVOID p)
   {
      ATLASSERT(m_pMalloc!=NULL);
      ATLASSERT(p);
      m_pMalloc->Free(p);
   }
};


class CShellImageLists
{
public:
   HIMAGELIST m_hImageListSmall;
   HIMAGELIST m_hImageListLarge;
   CShellImageLists() :
      m_hImageListSmall(NULL), m_hImageListLarge(NULL)
   {
   }
   virtual ~CShellImageLists()
   {
      if( m_hImageListSmall ) ImageList_Destroy(m_hImageListSmall);
      if( m_hImageListLarge ) ImageList_Destroy(m_hImageListLarge);
   }
   BOOL Create(HINSTANCE hResource, LPCTSTR RootID, LPCTSTR FolderID)
   {
      // Set the small image list
      if( m_hImageListSmall ) ImageList_Destroy(m_hImageListSmall);
      int nSmallCx = ::GetSystemMetrics(SM_CXSMICON);
      int nSmallCy = ::GetSystemMetrics(SM_CYSMICON);
      m_hImageListSmall = ImageList_Create(nSmallCx, nSmallCy, ILC_COLORDDB | ILC_MASK, 4, 0);

      // Set the large image list
      if( m_hImageListLarge ) ImageList_Destroy(m_hImageListLarge);
      int nLargeCx = ::GetSystemMetrics(SM_CXICON);
      int nLargeCy = ::GetSystemMetrics(SM_CYICON);
      m_hImageListLarge = ImageList_Create(nLargeCx, nLargeCy, ILC_COLORDDB | ILC_MASK, 4, 0);
      
      if(m_hImageListSmall) {
         HICON hIcon;
         hIcon = (HICON)::LoadImage(hResource, 
                                    MAKEINTRESOURCE(RootID),
                                    IMAGE_ICON, 
                                    nSmallCx, nSmallCy, 
                                    LR_DEFAULTCOLOR);
         ImageList_AddIcon(m_hImageListSmall, hIcon);
         hIcon = (HICON)::LoadImage(hResource, 
                                    MAKEINTRESOURCE(FolderID),
                                    IMAGE_ICON, 
                                    nSmallCx, nSmallCy, 
                                    LR_DEFAULTCOLOR);
         ImageList_AddIcon(m_hImageListSmall, hIcon);
      }      
      if(m_hImageListSmall) {
         HICON hIcon;
         hIcon = (HICON)::LoadImage(hResource,
                                    MAKEINTRESOURCE(RootID),
                                    IMAGE_ICON,
                                    nLargeCx, nLargeCy,
                                    LR_DEFAULTCOLOR);
         ImageList_AddIcon(m_hImageListLarge, hIcon);
         hIcon = (HICON)::LoadImage(hResource,
                                    MAKEINTRESOURCE(FolderID),
                                    IMAGE_ICON,
                                    nLargeCx, nLargeCy,
                                    LR_DEFAULTCOLOR);
         ImageList_AddIcon(m_hImageListLarge, hIcon);
      }
      
      return TRUE;
   }
};


class CShellModule : public CComModule
{
public:
   HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid=NULL)
   {
      ::OleInitialize(NULL);
#ifdef INITCOMMONCONTROLSEX
      INITCOMMONCONTROLSEX iccex;
      iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
      iccex.dwICC = ICC_LISTVIEW_CLASSES;
      ::InitCommonControlsEx(&iccex);
#else
      ::InitCommonControls();
#endif // INITCOMMONCONTROLSEX
#ifndef _NO_CLIPFORMATS
#ifndef CFSTR_LOGICALPERFORMEDDROPEFFECT 
#define CFSTR_LOGICALPERFORMEDDROPEFFECT TEXT("Logical Performed DropEffect")
#endif
      m_CFSTR_FILEDESCRIPTOR             = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR);
      m_CFSTR_FILECONTENTS               = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_FILECONTENTS);
      m_CFSTR_PASTESUCCEEDED             = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PASTESUCCEEDED);
      m_CFSTR_LOGICALPERFORMEDDROPEFFECT = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_LOGICALPERFORMEDDROPEFFECT);
      m_CFSTR_PERFORMEDDROPEFFECT        = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PERFORMEDDROPEFFECT);
      m_CFSTR_PREFERREDDROPEFFECT        = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_PREFERREDDROPEFFECT);
      m_CFSTR_SHELLIDLIST                = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_SHELLIDLIST);
#if (_WIN32_WINNT >= 0x0500)
      m_CFSTR_TARGETCLSID                = (CLIPFORMAT)::RegisterClipboardFormat(CFSTR_TARGETCLSID);
#endif // WIN32_WINNT
#endif // _NO_CLIPFORMATS
      m_Allocator.Init();
      return CComModule::Init(p, h, plibid);
   }
   void Term()
   {
      m_Allocator.Term();
      CComModule::Term();
   }
   // Shell Allocator
   CShellMalloc m_Allocator;
#ifndef _NO_CLIPFORMATS
   // Clipboard formats
   CLIPFORMAT m_CFSTR_FILEDESCRIPTOR;
   CLIPFORMAT m_CFSTR_FILECONTENTS;
   CLIPFORMAT m_CFSTR_PASTESUCCEEDED;
   CLIPFORMAT m_CFSTR_PERFORMEDDROPEFFECT;
   CLIPFORMAT m_CFSTR_LOGICALPERFORMEDDROPEFFECT;
   CLIPFORMAT m_CFSTR_PREFERREDDROPEFFECT;
   CLIPFORMAT m_CFSTR_SHELLIDLIST;
#if (_WIN32_WINNT >= 0x0500)
   CLIPFORMAT m_CFSTR_TARGETCLSID;
#endif // _WIN32_WINNT
#endif // _NO_CLIPFORMATS
};


#endif // __ATLSHELLEXTBASE_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -