Привет! Помогите, пожалуйста.
На последней строчке следующего кода появляется исключение "'System.NullReferenceException' — Additional information: Object reference not set to an instance of an object."
Такое ощущение, что ему не нравится полученный в функции GetUIObjectOf интерфейс IExtractIcon, однако GetUIObjectOf возвращает 0 (т.е. NOERROR), и отладчик показывает, что есть _ComObject ei, а вот как его функцию вызывать, так сразу этот косяк... Самое интересное, что абсолютно аналогичное поведение наблюдается при получении вместо IExtractIcon интерфейса IQueryInfo — т.е. как вызывать любую функцию интерфейса, так сразу NullReferenceException...

В чем может быть дело?
Вот код:
IShellFolder DesktopFolder = TGlobals.DesktopI;
PIDL[] Pidls = TGlobals.GetFolderItems(DesktopFolder, SHCONTF.FOLDERS);
PIDL[] arr = {Pidls[0]};
Guid IExtractIconGuid = new Guid("000214FA-0000-0000-C000-000000000046");
Guid IQueryInfoGuid = new Guid("00021500-0000-0000-C000-000000000046");
uint res = 0;
object eiObj = null;
res = DesktopFolder.GetUIObjectOf(IntPtr.Zero,1,arr,ref IExtractIconGuid,IntPtr.Zero, out eiObj);
IExtractIcon ei = (IExtractIcon)eiObj;
System.Text.StringBuilder sb = new System.Text.StringBuilder(512);
string IconFile = "";
int iIndex;
GIL RetFlags;
res = ei.GetIconLocation(GIL.FORSHELL,sb,sb.Capacity,out iIndex,out RetFlags);
На всякий пожарный — объявления интерфейсов:
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214E6-0000-0000-C000-000000000046")]
public 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, out IntPtr ppv);
[PreserveSig()]
uint BindToStorage(IntPtr pidl, IntPtr pbc, [In()] ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);
[PreserveSig()]
int 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, [MarshalAs(UnmanagedType.LPArray)] PIDL[] apidl, 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]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214FA-0000-0000-C000-000000000046")]
public interface IExtractIcon
{
uint Extract(string File, int IconIndex, out IntPtr hIconLarge, out IntPtr hIconSmall, int IconSize);
uint GetIconLocation(GIL Flags, System.Text.StringBuilder IconFile, int BufferMaxLength, out int iIndex, out GIL RetFlags);
}
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("00021500-0000-0000-C000-000000000046")]
public interface IQueryInfo
{
uint GetInfoFlags(out int Flags);
uint GetInfoTip(int Flags, [MarshalAs(UnmanagedType.LPWStr)] ref string Tip);
}