xref: /vim-8.2.3635/src/GvimExt/gvimext.h (revision 83cd0156)
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