Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освобождение ресурсов приложения... 
V
    Опции темы
Fiks
Дата 28.2.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.2.2009

Репутация: нет
Всего: нет



Пишу программу - файловый менеджер. Использую компонент 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. Не могу понять причину.
Помогите пожалуйста.

Это сообщение отредактировал(а) Fiks - 28.2.2009, 18:51
PM MAIL   Вверх
PashaPash
Дата 28.2.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: нет
Всего: 49



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();


--------------------
PM MAIL WWW   Вверх
Partizan
Дата 28.2.2009, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 67



Мои 5 копеек: посмотрите IShellFolder и IExtractIcon...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Fiks
Дата 28.2.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 21.2.2009

Репутация: нет
Всего: нет



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;


Спасибо за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0692 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.