Re: Почему не работает IShellFolder + IExtractIcon?
От: FlexLM Россия http://www.rbg.ru
Дата: 21.08.09 17:24
Оценка:
Даю 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);
А>    }    
А>
---
FlexLM
http://www.rbg.ru
development@rbg.ru
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.