Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Освобождение ресурсов приложения...


Автор: Fiks 28.2.2009, 18:08
Пишу программу - файловый менеджер. Использую компонент ListView для отображения файлов и папок. Для добавления иконок к файлу или папке использую следующий код:

Код

public partial class Main_Form : Form
    {


        [StructLayout(LayoutKind.Sequential)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public IntPtr iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;

           
        };

        class Win32
        {
            public const uint SHGFI_ICON = 0x100;
            public const uint SHGFI_LARGEICON = 0x0;    // 'Large icon
            public const uint SHGFI_SMALLICON = 0x1;    // 'Small icon

            [DllImport("shell32.dll")]
            public static extern IntPtr SHGetFileInfo(string pszPath,
                                        uint dwFileAttributes,
                                        ref SHFILEINFO psfi,
                                        uint cbSizeFileInfo,
                                        uint uFlags);
        }



Продолжение...

Код

IntPtr hImgSmall;    //the handle to the system image list
                 IntPtr hImgLarge;    //the handle to the system image list
                 string fName;        // 'the file name to get icon from
                 SHFILEINFO shinfo = new SHFILEINFO();

                 FoldersImageList.Images.Clear();
                 listView.SmallImageList = FoldersImageList;

                 DirectoryInfo[] dirs = theFolder.GetDirectories();

for (int i = 0; i < dirs.Length; i++)
                { 
                        listView.Items.Add(dirs[i].Name);
                        fName = dirs[i].FullName;
                        hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo,
                                       (uint)Marshal.SizeOf(shinfo),
                                       Win32.SHGFI_ICON |
                                      Win32.SHGFI_SMALLICON);
                        System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);


                        FoldersImageList.Images.Add(myIcon);
                        listView.Items[i].ImageIndex = 0;
}



Проблема в том, что после некоторого времени работы программы происходит исключение OutOFMemoryException. Сообщение говорит о том, что невозможно добавить элемент Icon в FoldersImageList. Не могу понять причину.
Помогите пожалуйста.

Автор: PashaPash 28.2.2009, 19:29
Icon.FromHandle: When using this method you must dispose of the resulting icon using the DestroyIcon method in the Win32 API to ensure the resources are released. 

добавь вызов для старых иконок перед FoldersImageList.Images.Clear();

Автор: Partizan 28.2.2009, 21:53
Мои 5 копеек: посмотрите IShellFolder и IExtractIcon...

Автор: Fiks 28.2.2009, 22:31
PashaPash, спасибо за совет, проблему решил, толь единственное но:
я добавляю метод Win32.DestroyIcon(shinfo.hIcon) уже после того, как добавил иконку в  FoldersImageList

Код

for (int i = 0; i < dirs.Length; i++)
                { 
                        listView.Items.Add(dirs[i].Name);
                        fName = dirs[i].FullName;
                        hImgSmall = Win32.SHGetFileInfo(fName, 0, ref shinfo,
                                       (uint)Marshal.SizeOf(shinfo),
                                       Win32.SHGFI_ICON |
                                      Win32.SHGFI_SMALLICON);
                        System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);
                        FoldersImageList.Images.Add(myIcon);

                        Win32.DestroyIcon(shinfo.hIcon)

                        listView.Items[i].ImageIndex = 0;


Спасибо за помощь!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)