Implementing an IShellFolder interface?

R

Robin Tucker

I need to create my own explorer-style control - I don't seem to have access
to IShellFolder - assuming I need it (which I think I do), how can this be
done? I've imported shell32.dll into my references.

I've seen a C# version of how to do it, but I have no idea how to translate
this into VB :-0.


(C# version below, no idea if it works or not!)



using System.Runtime.InteropServices;

[Flags()]
enum SHCONTF
{
SHCONTF_FOLDERS = 0x20,
SHCONTF_NONFOLDERS = 0x40,
SHCONTF_INCLUDEHIDDEN = 0x80,
SHCONTF_INIT_ON_FIRST_NEXT = 0x100,
SHCONTF_NETPRINTERSRCH = 0x200,
SHCONTF_SHAREABLE = 0x400,
SHCONTF_STORAGE = 0x800
}

[Flags()]
enum SFGAOF
{
SFGAO_CANCOPY = 0x1,
SFGAO_CANMOVE = 0x2,
SFGAO_CANLINK = 0x4,
SFGAO_STORAGE = 0x8,
SFGAO_CANRENAME = 0x10,
SFGAO_CANDELETE = 0x20,
SFGAO_HASPROPSHEET = 0x40,
SFGAO_DROPTARGET = 0x100,
SFGAO_CAPABILITYMASK = 0x177,
SFGAO_ENCRYPTED = 0x2000,
SFGAO_ISSLOW = 0x4000,
SFGAO_GHOSTED = 0x8000,
SFGAO_LINK = 0x10000,
SFGAO_SHARE = 0x20000,
SFGAO_READONLY = 0x40000,
SFGAO_HIDDEN = 0x80000,
SFGAO_DISPLAYATTRMASK = 0xFC000,
SFGAO_FILESYSANCESTOR = 0x10000000,
SFGAO_FOLDER = 0x20000000,
SFGAO_FILESYSTEM = 0x40000000,
SFGAO_HASSUBFOLDER = unchecked( (int) 0x80000000 ),
SFGAO_CONTENTSMASK = unchecked( (int) 0x80000000 ),
SFGAO_VALIDATE = 0x1000000,
SFGAO_REMOVABLE = 0x2000000,
SFGAO_COMPRESSED = 0x4000000,
SFGAO_BROWSABLE = 0x8000000,
SFGAO_NONENUMERATED = 0x100000,
SFGAO_NEWCONTENT = 0x200000,
SFGAO_CANMONIKER = 0x400000,
SFGAO_HASSTORAGE = 0x400000,
SFGAO_STREAM = 0x400000,
SFGAO_STORAGEANCESTOR = 0x800000,
SFGAO_STORAGECAPMASK = 0x70C50008
}

[Flags()]
enum SHGNO
{
SHGDN_NORMAL = 0x0,
SHGDN_INFOLDER = 0x1,
SHGDN_FOREDITING = 0x1000,
SHGDN_FORADDRESSBAR = 0x4000,
SHGDN_FORPARSING = 0x8000,
}

[StructLayout(LayoutKind.Sequential)]
struct STRRET
{
int uType;
/*
IntPtr pOleStr;
uint uOffset;
*/
[MarshalAs(UnmanagedType.ByValArray, SizeConst=260)] byte[] cStr;
}

[
ComImport(),
Guid("000214E6-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
interface IShellFolder
{
[PreserveSig()]
uint ParseDisplayName(
IntPtr hwnd,
IntPtr pbc,
[In(), MarshalAs(UnmanagedType.LPWStr)] string pszDisplayName,
out uint pchEaten,
out IntPtr ppidl,
ref uint pdwAttributes);

[PreserveSig()]
uint EnumObjects(
IntPtr hwnd,
SHCONTF grfFlags,
out IEnumIDList ppenumIDList);

[PreserveSig()]
uint BindToObject(
IntPtr pidl,
IntPtr pbc,
[In()] ref Guid riid,
[MarshalAs(UnmanagedType.Interface)] out object ppv);

[PreserveSig()]
uint BindToStorage(
IntPtr pidl,
IntPtr pbc,
[In()] ref Guid riid,
[MarshalAs(UnmanagedType.Interface)] out object ppv);

[PreserveSig()]
uint CompareIDs(
int lParam,
IntPtr pidl1,
IntPtr pidl2);

[PreserveSig()]
uint CreateViewObject(
IntPtr hwndOwner,
[In()] ref Guid riid,
[MarshalAs(UnmanagedType.Interface)] out object ppv);

[PreserveSig()]
uint GetAttributesOf(
int cidl,
[In(), MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,
[MarshalAs(UnmanagedType.LPArray)] SFGAOF[] rgfInOut);

[PreserveSig()]
uint GetUIObjectOf(
IntPtr hwndOwner,
int cidl,
[In(), MarshalAs(UnmanagedType.LPArray)] IntPtr[] apidl,
[In()] ref Guid riid,
IntPtr rgfReserved,
[MarshalAs(UnmanagedType.Interface)] out object ppv);

[PreserveSig()]
uint GetDisplayNameOf(
IntPtr pidl,
SHGNO uFlags,
out STRRET pName);

[PreserveSig()]
uint SetNameOf(
IntPtr hwnd,
IntPtr pidl,
[In(), MarshalAs(UnmanagedType.LPWStr)] string pszName,
SHGNO uFlags,
out IntPtr ppidlOut);
}

[
ComImport(),
Guid("000214F2-0000-0000-C000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
]
interface IEnumIDList {

[PreserveSig()]
uint Next(
int celt,
[MarshalAs(UnmanagedType.LPArray)] IntPtr[] rgelt,
out int pceltFetched);

void Skip(
int celt);

void Reset();

void Clone(
out IEnumIDList ppenum);
}
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top