mirror of
https://github.com/vim/vim.git
synced 2025-10-17 07:44:28 -04:00
177 lines
4.4 KiB
C++
177 lines
4.4 KiB
C++
/* vi:set ts=8 sts=4 sw=4:
|
|
*
|
|
* VIM - Vi IMproved gvimext by Tianmiao Hu
|
|
*
|
|
* Do ":help uganda" in Vim to read copying and usage conditions.
|
|
* Do ":help credits" in Vim to see a list of people who contributed.
|
|
*/
|
|
|
|
/*
|
|
* If you have any questions or any suggestions concerning gvimext, please
|
|
* contact Tianmiao Hu: tianmiao@acm.org.
|
|
*/
|
|
|
|
#if !defined(AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_)
|
|
#define AFX_STDAFX_H__3389658B_AD83_11D3_9C1E_0090278BBD99__INCLUDED_
|
|
|
|
#if defined(_MSC_VER) && _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
// Insert your headers here
|
|
// #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
|
|
|
|
//--------------------------------------------------------------
|
|
// common user interface routines
|
|
//
|
|
//
|
|
//--------------------------------------------------------------
|
|
|
|
#ifndef STRICT
|
|
# define STRICT
|
|
#endif
|
|
|
|
#define INC_OLE2 // WIN32, get ole2 from windows.h
|
|
|
|
/* Visual Studio 2005 has 'deprecated' many of the standard CRT functions */
|
|
#if defined(_MSC_VER) && _MSC_VER >= 1400
|
|
# define _CRT_SECURE_NO_DEPRECATE
|
|
# define _CRT_NONSTDC_NO_DEPRECATE
|
|
#endif
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <shlobj.h>
|
|
|
|
/* Accommodate old versions of VC that don't have a modern Platform SDK */
|
|
#if (defined(_MSC_VER) && _MSC_VER < 1300) || !defined(MAXULONG_PTR)
|
|
# undef UINT_PTR
|
|
# define UINT_PTR UINT
|
|
#endif
|
|
|
|
#define ResultFromShort(i) ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(i)))
|
|
|
|
// Initialize GUIDs (should be done only and at-least once per DLL/EXE)
|
|
//
|
|
#pragma data_seg(".text")
|
|
#define INITGUID
|
|
#include <initguid.h>
|
|
#include <shlguid.h>
|
|
|
|
//
|
|
// The class ID of this Shell extension class.
|
|
//
|
|
// class id: {51EEE242-AD87-11d3-9C1E-0090278BBD99}
|
|
//
|
|
//
|
|
// NOTE!!! If you use this shell extension as a starting point,
|
|
// you MUST change the GUID below. Simply run UUIDGEN.EXE
|
|
// to generate a new GUID.
|
|
//
|
|
|
|
// {51EEE242-AD87-11d3-9C1E-0090278BBD99}
|
|
// static const GUID <<name>> =
|
|
// { 0x51eee242, 0xad87, 0x11d3, { 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99 } };
|
|
//
|
|
//
|
|
|
|
// {51EEE242-AD87-11d3-9C1E-0090278BBD99}
|
|
// IMPLEMENT_OLECREATE(<<class>>, <<external_name>>,
|
|
// 0x51eee242, 0xad87, 0x11d3, 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99);
|
|
//
|
|
|
|
// {51EEE242-AD87-11d3-9C1E-0090278BBD99} -- this is the registry format
|
|
DEFINE_GUID(CLSID_ShellExtension, 0x51eee242, 0xad87, 0x11d3, 0x9c, 0x1e, 0x0, 0x90, 0x27, 0x8b, 0xbd, 0x99);
|
|
|
|
// this class factory object creates context menu handlers for windows 32 shell
|
|
class CShellExtClassFactory : public IClassFactory
|
|
{
|
|
protected:
|
|
ULONG m_cRef;
|
|
|
|
public:
|
|
CShellExtClassFactory();
|
|
~CShellExtClassFactory();
|
|
|
|
//IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
//IClassFactory members
|
|
STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *);
|
|
STDMETHODIMP LockServer(BOOL);
|
|
|
|
};
|
|
typedef CShellExtClassFactory *LPCSHELLEXTCLASSFACTORY;
|
|
#define MAX_HWND 100
|
|
|
|
// this is the actual OLE Shell context menu handler
|
|
class CShellExt : public IContextMenu,
|
|
IShellExtInit
|
|
{
|
|
protected:
|
|
ULONG m_cRef;
|
|
LPDATAOBJECT m_pDataObj;
|
|
UINT m_edit_existing_off;
|
|
|
|
// For some reason, this callback must be static
|
|
static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
|
|
|
|
STDMETHODIMP PushToWindow(HWND hParent,
|
|
LPCSTR pszWorkingDir,
|
|
LPCSTR pszCmd,
|
|
LPCSTR pszParam,
|
|
int iShowCmd,
|
|
int idHWnd);
|
|
|
|
STDMETHODIMP InvokeGvim(HWND hParent,
|
|
LPCSTR pszWorkingDir,
|
|
LPCSTR pszCmd,
|
|
LPCSTR pszParam,
|
|
int iShowCmd);
|
|
|
|
STDMETHODIMP InvokeSingleGvim(HWND hParent,
|
|
LPCSTR pszWorkingDir,
|
|
LPCSTR pszCmd,
|
|
LPCSTR pszParam,
|
|
int iShowCmd,
|
|
int useDiff);
|
|
|
|
public:
|
|
int m_cntOfHWnd;
|
|
HWND m_hWnd[MAX_HWND];
|
|
CShellExt();
|
|
~CShellExt();
|
|
|
|
//IUnknown members
|
|
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
//IShell members
|
|
STDMETHODIMP QueryContextMenu(HMENU hMenu,
|
|
UINT indexMenu,
|
|
UINT idCmdFirst,
|
|
UINT idCmdLast,
|
|
UINT uFlags);
|
|
|
|
STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
|
|
|
|
STDMETHODIMP GetCommandString(UINT_PTR idCmd,
|
|
UINT uFlags,
|
|
UINT FAR *reserved,
|
|
LPSTR pszName,
|
|
UINT cchMax);
|
|
|
|
//IShellExtInit methods
|
|
STDMETHODIMP Initialize(LPCITEMIDLIST pIDFolder,
|
|
LPDATAOBJECT pDataObj,
|
|
HKEY hKeyID);
|
|
};
|
|
|
|
typedef CShellExt *LPCSHELLEXT;
|
|
#pragma data_seg()
|
|
|
|
#endif
|