Почему не работает IShellFolder + IExtractIcon?
От: Аноним  
Дата: 21.06.05 21:45
Оценка:
Привет! Помогите, пожалуйста.
На последней строчке следующего кода появляется исключение "'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);
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.