[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214E6-0000-0000-C000-000000000046")]
interface IShellFolder
{
// Translates a file object's or folder's display name into an item
// identifier list.
// Return value: error code, if any
[PreserveSig()]
uint ParseDisplayName(
IntPtr hwnd, // Optional window handle
IntPtr pbc, // Optional bind context that controls the
// parsing operation. This parameter is
// normally set to NULL.
[In(), MarshalAs(UnmanagedType.LPWStr)]
string pszDisplayName, // Null-terminated UNICODE string with the
// display name.
out uint pchEaten, // Pointer to a ULONG value that receives the
// number of characters of the
// display name that was parsed.
out IntPtr ppidl, // Pointer to an ITEMIDLIST pointer that receives
// the item identifier list for
// the object.
ref uint pdwAttributes); // Optional parameter that can be used to
// query for file attributes.
// this can be values from the SFGAO enum
// Allows a client to determine the contents of a folder by creating
// an item identifier enumeration object and returning its
// IEnumIDList interface.
// Return value: error code, if any
[PreserveSig()]
uint EnumObjects(
IntPtr hwnd, // If user input is required to perform the
// enumeration, this window handle
// should be used by the enumeration object as
// the parent window to take
// user input.
SHCONTF grfFlags, // Flags indicating which items to include in the
// enumeration. For a list
// of possible values, see the SHCONTF enum.
out IEnumIDList ppenumIDList); // Address that receives a pointer to the
// IEnumIDList interface of the
// enumeration object created by this method.
// Retrieves an IShellFolder object for a subfolder.
// Return value: error code, if any
[PreserveSig()]
uint BindToObject(
IntPtr pidl, // Address of an ITEMIDLIST structure (PIDL)
// that identifies the subfolder.
IntPtr pbc, // Optional address of an IBindCtx interface on
// a bind context object to be
// used during this operation.
[In()]
ref Guid riid, // Identifier of the interface to return.
//[MarshalAs(UnmanagedType.Interface)]
out IntPtr ppv); // Address that receives the interface pointer.
// Requests a pointer to an object's storage interface.
// Return value: error code, if any
[PreserveSig()]
uint BindToStorage(
IntPtr pidl, // Address of an ITEMIDLIST structure that
// identifies the subfolder relative
// to its parent folder.
IntPtr pbc, // Optional address of an IBindCtx interface on a
// bind context object to be
// used during this operation.
[In()]
ref Guid riid, // Interface identifier (IID) of the requested
// storage interface.
[MarshalAs(UnmanagedType.Interface)]
out object ppv); // Address that receives the interface pointer
// specified by riid.
// Determines the relative order of two file objects or folders, given
// their item identifier lists. Return value: If this method is
// successful, the CODE field of the HRESULT contains one of the
// following values (the code can be retrived using the helper function
// GetHResultCode): Negative A
// negative return value indicates that the first item should precede
// the second (pidl1 < pidl2).
// Positive A positive return value indicates that the first item should
// follow the second (pidl1 > pidl2). Zero A return value of zero
// indicates that the two items are the same (pidl1 = pidl2).
[PreserveSig()]
int CompareIDs(
int lParam, // Value that specifies how the comparison
// should be performed. The lower
// Sixteen bits of lParam define the sorting
// rule.
// The upper sixteen bits of
// lParam are used for flags that modify the
// sorting rule. values can be from
// the SHCIDS enum
IntPtr pidl1, // Pointer to the first item's ITEMIDLIST
// structure.
IntPtr pidl2); // Pointer to the second item's ITEMIDLIST
// structure.
// Requests an object that can be used to obtain information from or interact
// with a folder object.
// Return value: error code, if any
[PreserveSig()]
uint CreateViewObject(
IntPtr hwndOwner, // Handle to the owner window.
[In()]
ref Guid riid, // Identifier of the requested interface.
[MarshalAs(UnmanagedType.Interface)]
out object ppv); // Address of a pointer to the requested
// interface.
// Retrieves the attributes of one or more file objects or subfolders.
// Return value: error code, if any
[PreserveSig()]
uint GetAttributesOf(
int cidl, // Number of file objects from which to retrieve
// attributes.
[In(), MarshalAs(UnmanagedType.LPArray)] IntPtr[]
apidl, // Address of an array of pointers to ITEMIDLIST
// structures, each of which
// uniquely identifies a file object relative to
// the parent folder.
[MarshalAs(UnmanagedType.LPArray)] SFGAOF[]
rgfInOut); // Address of a single ULONG value that, on
// entry,
// contains the attributes that the caller is
// requesting. On exit, this value contains the
// requested attributes that are common to all
// of the specified objects. this value can
// be from the SFGAO enum
// Retrieves an OLE interface that can be used to carry out actions on the
// specified file objects or folders. Return value: error code, if any
[PreserveSig()]
uint GetUIObjectOf(
IntPtr hwndOwner, // Handle to the owner window that the client
// should specify if it displays
// a dialog box or message box.
int cidl, // Number of file objects or subfolders specified
// in the apidl parameter.
[In(), MarshalAs(UnmanagedType.LPArray)] IntPtr[]
apidl, // Address of an array of pointers to ITEMIDLIST
// structures, each of which
// uniquely identifies a file object or subfolder
// relative to the parent folder.
[In()]
ref Guid riid, // Identifier of the COM interface object to
// return.
IntPtr rgfReserved, // Reserved.
[MarshalAs(UnmanagedType.Interface)]
out object ppv); // Pointer to the requested interface.
// Retrieves the display name for the specified file object or subfolder.
// Return value: error code, if any
[PreserveSig()]
uint GetDisplayNameOf(
IntPtr pidl, // Address of an ITEMIDLIST structure (PIDL)
// that uniquely identifies the file
// object or subfolder relative to the parent
// folder.
SHGNO uFlags, // Flags used to request the type of display name
// to return. For a list of possible values.
out STRRET pName); // Address of a STRRET structure in which to
// return the display name.
// Sets the display name of a file object or subfolder, changing the item
// identifier in the process.
// Return value: error code, if any
[PreserveSig()]
uint SetNameOf(
IntPtr hwnd, // Handle to the owner window of any dialog or
// message boxes that the client
// displays.
IntPtr pidl, // Pointer to an ITEMIDLIST structure that
// uniquely
// identifies the file object
// or subfolder relative to the parent folder.
[In(), MarshalAs(UnmanagedType.LPWStr)]
string pszName, // Pointer to a null-terminated string that
// specifies the new display name.
SHGNO uFlags, // Flags indicating the type of name specified by
// the lpszName parameter. For a list of possible
// values, see the description of the SHGNO
// enum.
out IntPtr ppidlOut); // Address of a pointer to an ITEMIDLIST
// structure
// which receives the new ITEMIDLIST.
}
Public Shared IID_IShellDetails As New Guid("{000214EC-0000-0000-C000-000000000046}"
<ComImportAttribute(), _
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown), _
Guid("000214E6-0000-0000-C000-000000000046")> _
Public Interface IShellFolder
<PreserveSig()> _
Function ParseDisplayName( _
ByVal hwndOwner As System.IntPtr, _
ByVal pbcReserved As System.IntPtr, _
<MarshalAs(UnmanagedType.LPWStr)> _
ByVal lpszDisplayName As String, _
ByRef pchEaten As Integer, _
ByRef ppidl As System.IntPtr, _
ByRef pdwAttributes As Integer) As Integer
<PreserveSig()> _
Function EnumObjects( _
ByVal hwndOwner As System.IntPtr, _
<MarshalAs(UnmanagedType.U4)> ByVal _
grfFlags As SHCONTF, _
ByRef ppenumIDList As IEnumIDList) As Integer
<PreserveSig()> _
Function BindToObject( _
ByVal pidl As System.IntPtr, _
ByVal pbcReserved As System.IntPtr, _
ByRef riid As Guid, _
ByRef ppvOut As IShellFolder) As Integer
<PreserveSig()> _
Function BindToStorage( _
ByRef pidl As System.IntPtr, _
ByVal pbcReserved As System.IntPtr, _
ByRef riid As Guid, _
ByVal ppvObj As System.IntPtr) As Integer
<PreserveSig()> _
Function CompareIDs( _
ByVal lParam As Int32, _
ByVal pidl1 As System.IntPtr, _
ByVal pidl2 As System.IntPtr) As Integer
<PreserveSig()> _
Function CreateViewObject( _
ByVal hwndOwner As IntPtr, _
ByVal riid As Guid, _
ByVal ppvOut As System.IntPtr) As Integer
<PreserveSig()> _
Function GetAttributesOf( _
ByVal cidl As Integer, _
ByRef pidl As System.IntPtr, _
ByRef rgfInOut As SFGAO) As Integer
<PreserveSig()> _
Function GetUIObjectOf( _
ByVal hwndOwner As System.IntPtr, _
ByVal cidl As Integer, _
ByRef apidl As IntPtr, _
ByRef riid As Guid, _
ByRef prgfInOut As Integer, _
ByRef ppvOut As IContextMenu) As Integer
<PreserveSig()> _
Function GetDisplayNameOf( _
ByVal pidl As System.IntPtr, _
<MarshalAs(UnmanagedType.U4)> _
ByVal uFlags As SHGDN, _
ByVal lpName As IntPtr) As Integer
<PreserveSig()> _
Function SetNameOf( _
ByVal hwndOwner As System.IntPtr, _
ByRef pidl As System.IntPtr, _
<MarshalAs(UnmanagedType.LPWStr)> _
ByVal lpszName As String, _
<MarshalAs(UnmanagedType.U4)> _
ByVal uFlags As SHCONTF, _
ByRef ppidlOut As System.IntPtr) As Integer
End Interface
None.
None.
I use this code a lot.
I can't read the previous version.
Too verbose.
//
// modified from Arik Poznanski
//
using System;
using System.Runtime.InteropServices;
namespace splitter7
{
/// <summary>
/// managed equivalent of IShellFolder interface
/// </summary>
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214E6-0000-0000-C000-000000000046")]
public interface IShellFolder
{
void ParseDisplayName(
IntPtr hwnd,
IntPtr pbc,
String pszDisplayName,
UInt32 pchEaten,
out IntPtr ppidl,
UInt32 pdwAttributes);
void EnumObjects(
IntPtr hwnd,
ESHCONTF grfFlags,
out IntPtr ppenumIDList);
void BindToObject(
IntPtr pidl,
IntPtr pbc,
[In] ref Guid riid,
out IntPtr ppv);
void BindToStorage(
IntPtr pidl,
IntPtr pbc,
[In] ref Guid riid,
out IntPtr ppv);
[PreserveSig]
Int32 CompareIDs(
Int32 lParam,
IntPtr pidl1,
IntPtr pidl2);
void CreateViewObject(
IntPtr hwndOwner,
[In] ref Guid riid,
out IntPtr ppv);
/* this version is good if cidl is one
* void GetAttributesOf(
UInt32 cidl,
ref IntPtr apidl,
ref ESFGAO rgfInOut);
*/
void GetAttributesOf(
UInt32 cidl,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)]
IntPtr[] apidl,
ref ESFGAO rgfInOut);
void GetUIObjectOf(
IntPtr hwndOwner,
UInt32 cidl, // number of IntPtr's in incoming array
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex=1)]
IntPtr[] apidl,
[In] ref Guid riid,
UInt32 rgfReserved,
out IntPtr ppv);
/* this version is good if cidl is one
void GetUIObjectOf(
IntPtr hwndOwner,
UInt32 cidl,
ref IntPtr apidl,
[In] ref Guid riid,
UInt32 rgfReserved,
out IntPtr ppv);
*/
void GetDisplayNameOf(
IntPtr pidl,
ESHGDN uFlags,
out STRRET pName);
void SetNameOf(
IntPtr hwnd,
IntPtr pidl,
String pszName,
ESHCONTF uFlags,
out IntPtr ppidlOut);
}
// from ShObjIdl.h
public enum ESFGAO : uint
{
SFGAO_CANCOPY = 0x00000001,
SFGAO_CANMOVE = 0x00000002,
SFGAO_CANLINK = 0x00000004,
SFGAO_LINK = 0x00010000,
SFGAO_SHARE = 0x00020000,
SFGAO_READONLY = 0x00040000,
SFGAO_HIDDEN = 0x00080000,
SFGAO_FOLDER = 0x20000000,
SFGAO_FILESYSTEM = 0x40000000,
SFGAO_HASSUBFOLDER = 0x80000000,
}
public enum ESHCONTF
{
SHCONTF_FOLDERS = 0x0020,
SHCONTF_NONFOLDERS = 0x0040,
SHCONTF_INCLUDEHIDDEN = 0x0080,
SHCONTF_INIT_ON_FIRST_NEXT = 0x0100,
SHCONTF_NETPRINTERSRCH = 0x0200,
SHCONTF_SHAREABLE = 0x0400,
SHCONTF_STORAGE = 0x0800
}
// from shlobj.h
public enum ESHGDN
{
SHGDN_NORMAL = 0x0000,
SHGDN_INFOLDER = 0x0001,
SHGDN_FOREDITING = 0x1000,
SHGDN_FORADDRESSBAR = 0x4000,
SHGDN_FORPARSING = 0x8000,
}
public enum ESTRRET : int
{
eeRRET_WSTR = 0x0000, // Use STRRET.pOleStr
STRRET_OFFSET = 0x0001, // Use STRRET.uOffset to Ansi
STRRET_CSTR = 0x0002 // Use STRRET.cStr
}
/*
// Microsoft's sample and it works too.
see sample, Unions.cs
union MYUNION2
{
int i;
char str[128];
};
[ StructLayout( LayoutKind.Explicit, Size=128 )]
public struct MyUnion2_1
{
[ FieldOffset( 0 )]
public int i;
}
*/
// shlobj.h
// this works too...from Unions.cs
[StructLayout(LayoutKind.Explicit, Size=520)]
public struct STRRETinternal
{
[FieldOffset(0)]
public IntPtr pOleStr;
[FieldOffset(0)]
public IntPtr pStr; // LPSTR pStr; NOT USED
[FieldOffset(0)]
public uint uOffset;
}
[StructLayout(LayoutKind.Sequential )]
public struct STRRET
{
public uint uType;
public STRRETinternal data;
}
public class Guid_IShellFolder
{
public static Guid IID_IShellFolder =
new Guid("{000214E6-0000-0000-C000-000000000046}");
}
}