📄 shlobj.h
字号:
#include <pshpack8.h>
//NOTE: When SEE_MASK_HMONITOR is set, hIcon is treated as hMonitor
typedef struct _CMINVOKECOMMANDINFO {
DWORD cbSize; // sizeof(CMINVOKECOMMANDINFO)
DWORD fMask; // any combination of CMIC_MASK_*
HWND hwnd; // might be NULL (indicating no owner window)
LPCSTR lpVerb; // either a string or MAKEINTRESOURCE(idOffset)
LPCSTR lpParameters; // might be NULL (indicating no parameter)
LPCSTR lpDirectory; // might be NULL (indicating no specific directory)
int nShow; // one of SW_ values for ShowWindow() API
DWORD dwHotKey;
HANDLE hIcon;
} CMINVOKECOMMANDINFO, *LPCMINVOKECOMMANDINFO;
typedef struct _CMInvokeCommandInfoEx {
DWORD cbSize; // must be sizeof(CMINVOKECOMMANDINFOEX)
DWORD fMask; // any combination of CMIC_MASK_*
HWND hwnd; // might be NULL (indicating no owner window)
LPCSTR lpVerb; // either a string or MAKEINTRESOURCE(idOffset)
LPCSTR lpParameters; // might be NULL (indicating no parameter)
LPCSTR lpDirectory; // might be NULL (indicating no specific directory)
int nShow; // one of SW_ values for ShowWindow() API
DWORD dwHotKey;
HANDLE hIcon;
LPCSTR lpTitle; // For CreateProcess-StartupInfo.lpTitle
LPCWSTR lpVerbW; // Unicode verb (for those who can use it)
LPCWSTR lpParametersW; // Unicode parameters (for those who can use it)
LPCWSTR lpDirectoryW; // Unicode directory (for those who can use it)
LPCWSTR lpTitleW; // Unicode title (for those who can use it)
#if (_WIN32_IE >= 0x0400)
POINT ptInvoke; // Point where it's invoked
#endif
} CMINVOKECOMMANDINFOEX, *LPCMINVOKECOMMANDINFOEX;
#include <poppack.h> /* Return to byte packing */
#undef INTERFACE
#define INTERFACE IContextMenu
DECLARE_INTERFACE_(IContextMenu, IUnknown)
{
// *** IUnknown methods ***
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
STDMETHOD(QueryContextMenu)(THIS_
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags) PURE;
STDMETHOD(InvokeCommand)(THIS_
LPCMINVOKECOMMANDINFO lpici) PURE;
STDMETHOD(GetCommandString)(THIS_
UINT_PTR idCmd,
UINT uType,
UINT * pwReserved,
LPSTR pszName,
UINT cchMax) PURE;
};
typedef IContextMenu * LPCONTEXTMENU;
//
// IContextMenu2 (IContextMenu with one new member)
//
// IContextMenu2::HandleMenuMsg
//
// This function is called, if the client of IContextMenu is aware of
// IContextMenu2 interface and receives one of following messages while
// it is calling TrackPopupMenu (in the window proc of hwnd):
// WM_INITPOPUP, WM_DRAWITEM and WM_MEASUREITEM
// The callee may handle these messages to draw owner draw menuitems.
//
#undef INTERFACE
#define INTERFACE IContextMenu2
DECLARE_INTERFACE_(IContextMenu2, IContextMenu)
{
// *** IUnknown methods ***
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// *** IContextMenu methods ***
STDMETHOD(QueryContextMenu)(THIS_
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags) PURE;
STDMETHOD(InvokeCommand)(THIS_
LPCMINVOKECOMMANDINFO lpici) PURE;
STDMETHOD(GetCommandString)(THIS_
UINT_PTR idCmd,
UINT uType,
UINT * pwReserved,
LPSTR pszName,
UINT cchMax) PURE;
// *** IContextMenu2 methods ***
STDMETHOD(HandleMenuMsg)(THIS_
UINT uMsg,
WPARAM wParam,
LPARAM lParam) PURE;
};
typedef IContextMenu2 * LPCONTEXTMENU2;
//
// IContextMenu3 (IContextMenu with one new member)
//
// IContextMenu3::HandleMenuMsg2
//
// This function is called, if the client of IContextMenu is aware of
// IContextMenu3 interface and receives a menu message while
// it is calling TrackPopupMenu (in the window proc of hwnd):
//
#undef INTERFACE
#define INTERFACE IContextMenu3
DECLARE_INTERFACE_(IContextMenu3, IContextMenu2)
{
// *** IUnknown methods ***
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
STDMETHOD_(ULONG,AddRef) (THIS) PURE;
STDMETHOD_(ULONG,Release) (THIS) PURE;
// *** IContextMenu methods ***
STDMETHOD(QueryContextMenu)(THIS_
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags) PURE;
STDMETHOD(InvokeCommand)(THIS_
LPCMINVOKECOMMANDINFO lpici) PURE;
STDMETHOD(GetCommandString)(THIS_
UINT_PTR idCmd,
UINT uType,
UINT * pwReserved,
LPSTR pszName,
UINT cchMax) PURE;
// *** IContextMenu2 methods ***
STDMETHOD(HandleMenuMsg)(THIS_
UINT uMsg,
WPARAM wParam,
LPARAM lParam) PURE;
// *** IContextMenu3 methods ***
STDMETHOD(HandleMenuMsg2)(THIS_
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
LRESULT* plResult) PURE;
};
typedef IContextMenu3 * LPCONTEXTMENU3;
#if (_WIN32_IE >= 0x0500)
#undef INTERFACE
#define INTERFACE IPersistFolder3
#define CSIDL_FLAG_PFTI_TRACKTARGET CSIDL_FLAG_DONT_VERIFY
// DESCRIPTION: PERSIST_FOLDER_TARGET_INFO
// This stucture is used for Folder Shortcuts which allow the shell to
// have a file system folder act like another area in the name space.
// One of pidlTargetFolder, szTargetParsingName, or csidl needs to
// specify the destination name space.
//
// pidlTargetFolder: This is a full pidl to the target folder. Can be NULL in the IPersistFolder3::InitializeEx()
// call but not in the GetFolderTargetInfo() return structure.
// szTargetParsingName: Empty string if not specified. Ortherwise, it is the parsible name
// to the target. This name can be parsed by IShellFolder::
// ParsedName() from the desktop.
// szNetworkProvider: Can be an empty string. If not empty, it specifies the type of network
// provider that will be used when binding to the target. This is used
// for performance optimizations for the WNet APIs.
// dwAttributes: -1 if not known. These are the SFGAO_ flags for IShellFolder::GetAttributesOf()
// csidl: This is -1 if it's not used. This can be used instead of pidlTargetFolder or
// szTargetParsingName to indicate the TargetFolder. See the list of CSIDL_ folders
// below. CSIDL_FLAG_PFTI_TRACKTARGET means that the IShellFolder's target folder
// should change if the user changes the target of the underlying CSIDL value.
// You can also pass CSIDL_FLAG_CREATE to indicate that the target folder
// should be created if it does not exist. No other CSIDL_FLAG_* values are supported.
#include <pshpack8.h>
typedef struct
{
LPITEMIDLIST pidlTargetFolder; // pidl for the folder we want to intiailize
WCHAR szTargetParsingName[MAX_PATH]; // optional parsing name for the target
WCHAR szNetworkProvider[MAX_PATH]; // optional network provider
DWORD dwAttributes; // optional FILE_ATTRIBUTES_ flags (-1 if not used)
int csidl; // optional folder index (SHGetFolderPath()) -1 if not used
} PERSIST_FOLDER_TARGET_INFO;
#include <poppack.h> /* Return to byte packing */
// DESCRIPTION: IPersistFolder3
// This interface is implemented by an IShellFolder object that wants non-default
// handling of Folder Shortcuts. In general, shell name space extensions should use
// pidlRoot (the alias pidl) as their location in the name space and pass it to public
// APIs, such as ShellExecute(). The one exception is that pidlTarget should be used
// when sending ChangeNotifies or registering to listen for change notifies
// (see SFVM_GETNOTIFY).
//
// InitializeEx: This method initializes an IShellFolder and specifies where
// it is rooted in the name space.
// pbc: May be NULL.
// pidlRoot: This is the same parameter as IPersistFolder::Initialize(). Caller allocates
// and frees this parameter.
// ppfti: May be NULL, in which case this is the same as a call to IPersistFolder::Initialize().
// Otherwise this is a Folder Shortcut and this structure specifies the target
// folder and it's attributes.
// GetFolderTargetInfo: This is used by the caller to find information about
// the folder shortcut. This structure may not be initialized by the caller,
// so the callee needs to initialize every member. The callee allocates
// pidlTargetFolder and the caller will free it. Filling in pidlTargetFolder is
// ALWAYS required.
DECLARE_INTERFACE_(IPersistFolder3, IPersistFolder2)
{
// *** IUnknown methods ***
STDMETHOD(QueryInterface)(THIS_ REFIID riid, void **ppv) PURE;
STDMETHOD_(ULONG,AddRef)(THIS) PURE;
STDMETHOD_(ULONG,Release)(THIS) PURE;
// *** IPersist methods ***
STDMETHOD(GetClassID)(THIS_ LPCLSID lpClassID) PURE;
// *** IPersistFolder methods ***
STDMETHOD(Initialize)(THIS_ LPCITEMIDLIST pidl) PURE;
// *** IPersistFolder2 methods ***
STDMETHOD(GetCurFolder)(THIS_ LPITEMIDLIST *ppidl) PURE;
// *** IPersistFolder3 methods ***
STDMETHOD(InitializeEx)(THIS_ IBindCtx *pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO *ppfti) PURE;
STDMETHOD(GetFolderTargetInfo)(THIS_ PERSIST_FOLDER_TARGET_INFO *ppfti) PURE;
};
#endif
//
//===========================================================================
//
// IExtractIcon interface
//
// This interface is used in two different places in the shell.
//
// Case-1: Icons of sub-folders for the scope-pane of the explorer.
//
// It is used by the explorer to get the "icon location" of
// sub-folders from each shell folders. When the user expands a folder
// in the scope pane of the explorer, the explorer does following:
// (1) binds to the folder (gets IShellFolder),
// (2) enumerates its sub-folders by calling its EnumObjects member,
// (3) calls its GetUIObjectOf member to get IExtractIcon interface
// for each sub-folders.
// In this case, the explorer uses only IExtractIcon::GetIconLocation
// member to get the location of the appropriate icon. An icon location
// always consists of a file name (typically DLL or EXE) and either an icon
// resource or an icon index.
//
//
// Case-2: Extracting an icon image from a file
//
// It is used by the shell when it extracts an icon image
// from a file. When the shell is extracting an icon from a file,
// it does following:
// (1) creates the icon extraction handler object (by getting its CLSID
// under the {ProgID}\shell\ExtractIconHanler key and calling
// CoCreateInstance requesting for IExtractIcon interface).
// (2) Calls IExtractIcon::GetIconLocation.
// (3) Then, calls IExtractIcon::ExtractIcon with the location/index pair.
// (4) If (3) returns NOERROR, it uses the returned icon.
// (5) Otherwise, it recursively calls this logic with new location
// assuming that the location string contains a fully qualified path name.
//
// From extension programmer's point of view, there are only two cases
// where they provide implementations of IExtractIcon:
// Case-1) providing explorer extensions (i.e., IShellFolder).
// Case-2) providing per-instance icons for some types of files.
//
// Because Case-1 is described above, we'll explain only Case-2 here.
//
// When the shell is about display an icon for a file, it does following:
// (1) Finds its ProgID and ClassID.
// (2) If the file has a ClassID, it gets the icon location string from the
// "DefaultIcon" key under it. The string indicates either per-class
// icon (e.g., "FOOBAR.DLL,2") or per-instance icon (e.g., "%1,1").
// (3) If a per-instance icon is specified, the shell creates an icon
// extraction handler object for it, and extracts the icon from it
// (which is described above).
//
// It is important to note that the shell calls IExtractIcon::GetIconLocation
// first, then calls IExtractIcon::Extract. Most application programs
// that support per-instance icons will probably store an icon location
// (DLL/EXE name and index/id) rather than an icon image in each file.
// In those cases, a programmer needs to implement only the GetIconLocation
// member and it Extract member simply returns S_FALSE. They need to
// implement Extract member only if they decided to store the icon images
// within files themselved or some other database (which is very rare).
//
//
//
// [Member functions]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -