1 /* vi:set ts=8 sts=4 sw=4: 2 * 3 * VIM - Vi IMproved gvimext by Tianmiao Hu 4 * 5 * Do ":help uganda" in Vim to read copying and usage conditions. 6 * Do ":help credits" in Vim to see a list of people who contributed. 7 */ 8 9 /* 10 * If you have any questions or any suggestions concerning gvimext, please 11 * contact Tianmiao Hu: [email protected]. 12 */ 13 14 #if !defined(AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_) 15 #define AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_ 16 17 #if defined(_MSC_VER) && _MSC_VER > 1000 18 #pragma once 19 #endif 20 21 // Insert your headers here 22 // #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers 23 24 //-------------------------------------------------------------- 25 // common user interface routines 26 // 27 // 28 //-------------------------------------------------------------- 29 30 #ifndef STRICT 31 # define STRICT 32 #endif 33 34 #define INC_OLE2 // MS-Windows, get ole2 from windows.h 35 36 /* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */ 37 #if defined(_MSC_VER) && _MSC_VER >= 1400 38 # define _CRT_SECURE_NO_DEPRECATE 39 # define _CRT_NONSTDC_NO_DEPRECATE 40 #endif 41 42 #include <windows.h> 43 #include <windowsx.h> 44 #include <shlobj.h> 45 #include <wchar.h> 46 47 /* Accommodate old versions of VC that don't have a modern Platform SDK */ 48 #if (defined(_MSC_VER) && _MSC_VER < 1300) || !defined(MAXULONG_PTR) 49 # undef UINT_PTR 50 # define UINT_PTR UINT 51 #endif 52 53 #define ResultFromShort(i) ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(i))) 54 55 // Initialize GUIDs (should be done only and at-least once per DLL/EXE) 56 // 57 #pragma data_seg(".text") 58 #define INITGUID 59 #include <initguid.h> 60 61 // 62 // The class ID of this Shell extension class. 63 // 64 // class id: {51EEE242-AD87-11d3-9C1E-0090278BBD99} 65 // 66 // 67 // NOTE!!! If you use this shell extension as a starting point, 68 // you MUST change the GUID below. Simply run UUIDGEN.EXE 69 // to generate a new GUID. 70 // 71 72 // {51EEE242-AD87-11d3-9C1E-0090278BBD99} 73 // static const GUID <<name>> = 74 // { 0x51eee242, 0xad87, 0x11d3, { 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99 } }; 75 // 76 // 77 78 // {51EEE242-AD87-11d3-9C1E-0090278BBD99} 79 // IMPLEMENT_OLECREATE(<<class>>, <<external_name>>, 80 // 0x51eee242, 0xad87, 0x11d3, 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99); 81 // 82 83 // {51EEE242-AD87-11d3-9C1E-0090278BBD99} -- this is the registry format 84 DEFINE_GUID(CLSID_ShellExtension, 0x51eee242, 0xad87, 0x11d3, 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99); 85 86 // this class factory object creates context menu handlers for windows 32 shell 87 class CShellExtClassFactory : public IClassFactory 88 { 89 protected: 90 ULONG m_cRef; 91 92 public: 93 CShellExtClassFactory(); 94 ~CShellExtClassFactory(); 95 96 //IUnknown members 97 STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *); 98 STDMETHODIMP_(ULONG) AddRef(); 99 STDMETHODIMP_(ULONG) Release(); 100 101 //IClassFactory members 102 STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *); 103 STDMETHODIMP LockServer(BOOL); 104 105 }; 106 typedef CShellExtClassFactory *LPCSHELLEXTCLASSFACTORY; 107 #define MAX_HWND 100 108 109 // this is the actual OLE Shell context menu handler 110 class CShellExt : public IContextMenu, 111 IShellExtInit 112 { 113 private: 114 BOOL LoadMenuIcon(); 115 116 protected: 117 ULONG m_cRef; 118 LPDATAOBJECT m_pDataObj; 119 UINT m_edit_existing_off; 120 HBITMAP m_hVimIconBitmap; 121 122 // For some reason, this callback must be static 123 static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam); 124 125 STDMETHODIMP PushToWindow(HWND hParent, 126 LPCSTR pszWorkingDir, 127 LPCSTR pszCmd, 128 LPCSTR pszParam, 129 int iShowCmd, 130 int idHWnd); 131 132 STDMETHODIMP InvokeSingleGvim(HWND hParent, 133 LPCSTR pszWorkingDir, 134 LPCSTR pszCmd, 135 LPCSTR pszParam, 136 int iShowCmd, 137 int gvimExtraOptions); 138 139 public: 140 int m_cntOfHWnd; 141 HWND m_hWnd[MAX_HWND]; 142 CShellExt(); 143 ~CShellExt(); 144 145 //IUnknown members 146 STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *); 147 STDMETHODIMP_(ULONG) AddRef(); 148 STDMETHODIMP_(ULONG) Release(); 149 150 //IShell members 151 STDMETHODIMP QueryContextMenu(HMENU hMenu, 152 UINT indexMenu, 153 UINT idCmdFirst, 154 UINT idCmdLast, 155 UINT uFlags); 156 157 STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi); 158 159 STDMETHODIMP GetCommandString(UINT_PTR idCmd, 160 UINT uFlags, 161 UINT FAR *reserved, 162 LPSTR pszName, 163 UINT cchMax); 164 165 //IShellExtInit methods 166 STDMETHODIMP Initialize(LPCITEMIDLIST pIDFolder, 167 LPDATAOBJECT pDataObj, 168 HKEY hKeyID); 169 }; 170 171 typedef CShellExt *LPCSHELLEXT; 172 #pragma data_seg() 173 174 #endif 175