Даю 90%, что IExtractIcon реализован в том же объекте, что IShellFolder. Объект IShellFolder удаляется при смене папки — обращение к IExtractIcon уходит в освобожденную память. Folder и UIObject имеют разное время жизни.
Здравствуйте, Аноним, Вы писали:
А>Привет! Помогите, пожалуйста.
А>На последней строчке следующего кода появляется исключение "'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);
А> }
А>