xref: /vim-8.2.3635/src/GvimExt/gvimext.h (revision ba3ff539)
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	// WIN32, 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 #include <shlguid.h>
61 
62 //
63 // The class ID of this Shell extension class.
64 //
65 // class id:  {51EEE242-AD87-11d3-9C1E-0090278BBD99}
66 //
67 //
68 // NOTE!!!  If you use this shell extension as a starting point,
69 //	    you MUST change the GUID below.  Simply run UUIDGEN.EXE
70 //	    to generate a new GUID.
71 //
72 
73 // {51EEE242-AD87-11d3-9C1E-0090278BBD99}
74 // static const GUID <<name>> =
75 // { 0x51eee242, 0xad87, 0x11d3, { 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99 } };
76 //
77 //
78 
79 // {51EEE242-AD87-11d3-9C1E-0090278BBD99}
80 // IMPLEMENT_OLECREATE(<<class>>, <<external_name>>,
81 // 0x51eee242, 0xad87, 0x11d3, 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99);
82 //
83 
84 // {51EEE242-AD87-11d3-9C1E-0090278BBD99}  -- this is the registry format
85 DEFINE_GUID(CLSID_ShellExtension, 0x51eee242, 0xad87, 0x11d3, 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99);
86 
87 // this class factory object creates context menu handlers for windows 32 shell
88 class CShellExtClassFactory : public IClassFactory
89 {
90 protected:
91 	ULONG	m_cRef;
92 
93 public:
94 	CShellExtClassFactory();
95 	~CShellExtClassFactory();
96 
97 	//IUnknown members
98 	STDMETHODIMP			QueryInterface(REFIID, LPVOID FAR *);
99 	STDMETHODIMP_(ULONG)	AddRef();
100 	STDMETHODIMP_(ULONG)	Release();
101 
102 	//IClassFactory members
103 	STDMETHODIMP		CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *);
104 	STDMETHODIMP		LockServer(BOOL);
105 
106 };
107 typedef CShellExtClassFactory *LPCSHELLEXTCLASSFACTORY;
108 #define MAX_HWND 100
109 
110 // this is the actual OLE Shell context menu handler
111 class CShellExt : public IContextMenu,
112 			 IShellExtInit
113 {
114 private:
115     BOOL LoadMenuIcon();
116 
117 protected:
118     ULONG	 m_cRef;
119     LPDATAOBJECT m_pDataObj;
120     UINT	 m_edit_existing_off;
121     HBITMAP	 m_hVimIconBitmap;
122 
123     // For some reason, this callback must be static
124     static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
125 
126     STDMETHODIMP PushToWindow(HWND hParent,
127 	    LPCSTR pszWorkingDir,
128 	    LPCSTR pszCmd,
129 	    LPCSTR pszParam,
130 	    int iShowCmd,
131 	    int idHWnd);
132 
133     STDMETHODIMP InvokeGvim(HWND hParent,
134 	    LPCSTR pszWorkingDir,
135 	    LPCSTR pszCmd,
136 	    LPCSTR pszParam,
137 	    int iShowCmd);
138 
139     STDMETHODIMP InvokeSingleGvim(HWND hParent,
140 	    LPCSTR pszWorkingDir,
141 	    LPCSTR pszCmd,
142 	    LPCSTR pszParam,
143 	    int iShowCmd,
144 	    int useDiff);
145 
146 public:
147     int		 m_cntOfHWnd;
148     HWND	 m_hWnd[MAX_HWND];
149     CShellExt();
150     ~CShellExt();
151 
152     //IUnknown members
153     STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
154     STDMETHODIMP_(ULONG) AddRef();
155     STDMETHODIMP_(ULONG) Release();
156 
157     //IShell members
158     STDMETHODIMP QueryContextMenu(HMENU hMenu,
159 	    UINT indexMenu,
160 	    UINT idCmdFirst,
161 	    UINT idCmdLast,
162 	    UINT uFlags);
163 
164     STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
165 
166     STDMETHODIMP GetCommandString(UINT_PTR idCmd,
167 	    UINT uFlags,
168 	    UINT FAR *reserved,
169 	    LPSTR pszName,
170 	    UINT cchMax);
171 
172     //IShellExtInit methods
173     STDMETHODIMP Initialize(LPCITEMIDLIST pIDFolder,
174 	    LPDATAOBJECT pDataObj,
175 	    HKEY hKeyID);
176 };
177 
178 typedef CShellExt *LPCSHELLEXT;
179 #pragma data_seg()
180 
181 #endif
182