Непонятки с SHGetFileInfo()...
От: spacetime  
Дата: 25.05.11 17:09
Оценка:
Привет, уважаемые форумчане. Пишу файловый менеджер. Для отображения иконок файлов пользуясь функцией SHGetFileInfo(......). Но порблема в том что какои первый фаил наидет такими будут все остальные иконки. Пишу на Visual studio 2010 C++, MFC WinAPi .Пожайлуста помогите. Вот отрывок кода :



HICON CFilemanagerDlg::GetFileInfo(CString str)
{
UINT uFlags = SHGFI_ICON | SHGFI_ICONLOCATION | SHGFI_LARGEICON | SHGFI_DISPLAYNAME | SHGFI_SHELLICONSIZE | SHGFI_SYSICONINDEX | SHGFI_EXETYPE ;
CString tmp = (LPCWSTR)str;

memset(&m_sf,0,sizeof(m_sf));

HICON hicon;
CImageList * m_pImage = new CImageList();
m_pImage->Attach((HIMAGELIST)SHGetFileInfo(tmp,0,&m_sf,sizeof(m_sf),uFlags));



hicon = m_pImage->ExtractIcon(m_sf.iIcon);
m_pImage->Detach();

return hicon;
}


А Вот функция где вызывается GetFileInfo:

void CFilemanagerDlg::findFiles(int &count, CString &dtemp, BOOL isRefrashe)
{
CFileFind find;
count = 0; // Количество элемент в list control
CString temp;// временная переменная для хранения адресса из адрессной edit box-а которая характеризуется переменным-членом m_str
HICON h;// handle иконок
BOOL f;


temp = m_str; // Это переменные CString в которых->
str0 = temp; // ->сохраняются старые и новые пути каталогов->
dtemp = temp; // ->и файлов для навигации по директориям
int index; // Это индекс иконок в image list

CImageList* imgList = new CImageList();
imgList->Create(32,32,ILC_MASK | ILC_COLOR32,0,0);

if(isRefrashe == true)
temp = str0;

f = find.FindFile(temp+"\\*");

while(f)
{
f = find.FindNextFile();

if(find.IsDots())
continue;

str = find.GetFilePath();
temp = str;
str0 = str;
/*(******)*/ h = GetFileInfo(str); //
CollapsedExpandedWrap enabledWrap disabledLine numbers onLine numbers off

      ВОТ ЗДЕСЬ И ВЫЗЫВАЕТСЯ GetFileInfo()



if(h == 0)
{
MessageBox((LPCTSTR)_T("Error icon handle"),(LPCTSTR)_T("Error !"),MB_ICONSTOP);
exit(-1);
}

index = imgList->Add(h);
DestroyIcon(h);

m_list.InsertItem(count,str);

count++;
}

m_list.SetImageList(imgList, TVSIL_NORMAL);
find.Close();
}



26.05.11 11:57: Перенесено из 'C/C++'
Re: Непонятки с SHGetFileInfo()...
От: De-Bugger  
Дата: 26.05.11 08:12
Оценка:
Здравствуйте, spacetime, Вы писали:

S>UINT uFlags = SHGFI_ICON | SHGFI_ICONLOCATION | SHGFI_LARGEICON | SHGFI_DISPLAYNAME | SHGFI_SHELLICONSIZE | SHGFI_SYSICONINDEX | SHGFI_EXETYPE ;


На кой ляд перечислять все флаги? Вот к примеру SHGFI_EXETYPE напуркуа? Тем паче что:

SHGFI_EXETYPE (0x000002000)

Retrieve the type of the executable file if pszPath identifies an executable file. The information is packed into the return value. This flag cannot be specified with any other flags.

Re: Непонятки с SHGetFileInfo()...
От: Melamed Россия  
Дата: 26.05.11 08:36
Оценка:
Здравствуйте, spacetime, Вы писали:

Во первых вызов функции SHGetFileInfo должен быть следующим

Код взят из собственного примера, написанного на чистом WINAPI.

SHFILEINFO shFI;
HIMAGELIST hSysIconList =(HIMAGELIST)SHGetFileInfo(pd.GetName().data(),//Имя файла
    FILE_ATTRIBUTE_NORMAL,&shFI,sizeof(SHFILEINFO),
    SHGFI_ICON | SHGFI_SMALLICON);


Хендл на иконку берется в shFi.hIcon и вставляется ручками в свой ImageList;
Затем уничтожается иконка DestroyIcon(shFI.hIcon)
Re[2]: Непонятки с SHGetFileInfo()...
От: spacetime  
Дата: 26.05.11 13:37
Оценка:
Здравствуйте, Melamed, Вы писали:

M>Здравствуйте, spacetime, Вы писали:


M>Во первых вызов функции SHGetFileInfo должен быть следующим


M>Код взят из собственного примера, написанного на чистом WINAPI.


M>
M>SHFILEINFO shFI;
M>HIMAGELIST hSysIconList =(HIMAGELIST)SHGetFileInfo(pd.GetName().data(),//Имя файла
M>    FILE_ATTRIBUTE_NORMAL,&shFI,sizeof(SHFILEINFO),
M>    SHGFI_ICON | SHGFI_SMALLICON);
M>


M>Хендл на иконку берется в shFi.hIcon и вставляется ручками в свой ImageList;

M>Затем уничтожается иконка DestroyIcon(shFI.hIcon)

Немного изменил код вот, в .h файл диалога добавил переменную m_list_image типа CimageList в место локальной CimageList* m_pImage и делаю Add уже в самой функции GetPathIcon сократил число флаг оставив только самые нужные:

HICON CSHFILEINFODlg::GetPathIcon(LPCTSTR sPath, int &inx)
{
    SHFILEINFO FileInfo;    
    memset(&FileInfo,0,sizeof(FileInfo));

    HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | SHGFI_SYSICONINDEX);    
    inx = FileInfo.iIcon;
    
    HICON hIcon = FileInfo.hIcon;// Получаем хендл на иконку
    m_list_image.Add(hIcon); //переменая-член класса диалога типа CimageList;
    DestroyIcon(hIcon);
    return hIcon;    
}


Потом делаю m_list.SetImageList(&m_list_image,LVSIL_SMALL)(Не в GetPathIcon а в другом месте тело программы).... Ничего не получается у всех файлов одна и та же иконка. Кажется все перепробовал
Что можно еще делать ?
Re[3]: Непонятки с SHGetFileInfo()...
От: De-Bugger  
Дата: 26.05.11 18:10
Оценка:
Здравствуйте, spacetime, Вы писали:

S> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?


Все равно не читаете документацию:

If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.


Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?
Re[4]: Непонятки с SHGetFileInfo()...
От: spacetime  
Дата: 27.05.11 06:06
Оценка:
Здравствуйте, De-Bugger, Вы писали:

DB>Здравствуйте, spacetime, Вы писали:


S>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?


DB>Все равно не читаете документацию:


DB>

DB>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.


DB>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?


В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?
Re[5]: Непонятки с SHGetFileInfo()...
От: spacetime  
Дата: 27.05.11 10:35
Оценка:
Здравствуйте, spacetime, Вы писали:

S>Здравствуйте, De-Bugger, Вы писали:


DB>>Здравствуйте, spacetime, Вы писали:


S>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?


DB>>Все равно не читаете документацию:


DB>>

DB>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.


DB>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?


S>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?


Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится


void CFilemanagerDlg::findFiles(int &count, CString &dtemp, BOOL isRefrashe)
      {
          CFileFind find;
          count = 0;
          CString temp;
          HICON h;
          BOOL f;
          LVITEM lvItem;
          int ind;    
       
          temp = m_str;
          str0 = temp;
          dtemp = temp;
          int index;
       
          if(isRefrashe == true)
              temp = str0;
       
          f = find.FindFile(temp+"\\*");  
       
              while(f)
              {
                  f = find.FindNextFile();
       
                  if(find.IsDots())
                      continue;          
       
                  str = find.GetFilePath();  
                  temp = str;
                  str0 = str;
       
                  lvItem.mask = LVIF_IMAGE|LVIF_TEXT; //Объявление и иницализация структуры
                  lvItem.state = 0;
                  lvItem.stateMask = 0 ;
                  lvItem.iItem = count;
                  lvItem.iImage= count;
                  lvItem.iSubItem = 0;
                  lvItem.pszText = T2W(str.GetBuffer(str.GetLength()));  
                  str.ReleaseBuffer();
                  lvItem.cchTextMax = str.GetLength();            
       
                  GetFileInfo(str);
                  m_list.InsertItem(&lvItem);
                  m_count = count++;                          
              }
       
              m_list.SetImageList(&m_list_imglist,LVSIL_NORMAL);  
       
              find.Close();      
      }

Вот функция GetFileInfo:


void CFilemanagerDlg::GetFileInfo(CString str,BOOL isList)
{
    SHFILEINFO FileInfo;
    memset(&FileInfo,0,sizeof(FileInfo));
    HICON hIcon;

    HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(str, GetFileAttributes(str),&FileInfo, sizeof( FileInfo ),SHGFI_ICON);    
    int inx = FileInfo.iIcon;
    hIcon = FileInfo.hIcon;

    if(isList)
        m_list_imglist.Add(hIcon);    
    else
        m_tree_imglist.Add(hIcon);    
    DestroyIcon(hIcon);
}
Re[6]: Непонятки с SHGetFileInfo()...
От: Аноним  
Дата: 27.05.11 11:10
Оценка:
Здравствуйте, spacetime, Вы писали:

S>Здравствуйте, spacetime, Вы писали:


S>>Здравствуйте, De-Bugger, Вы писали:


DB>>>Здравствуйте, spacetime, Вы писали:


S>>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?


DB>>>Все равно не читаете документацию:


DB>>>

DB>>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.


DB>>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?


S>>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?


S>Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится



S>
S>void CFilemanagerDlg::findFiles(int &count, CString &dtemp, BOOL isRefrashe)
S>      {
S>          CFileFind find;
S>          count = 0;
S>          CString temp;
S>          HICON h;
S>          BOOL f;
S>          LVITEM lvItem;
S>          int ind;    
       
S>          temp = m_str;
S>          str0 = temp;
S>          dtemp = temp;
S>          int index;
       
S>          if(isRefrashe == true)
S>              temp = str0;
       
S>          f = find.FindFile(temp+"\\*");  
       
S>              while(f)
S>              {
S>                  f = find.FindNextFile();
       
S>                  if(find.IsDots())
S>                      continue;          
       
S>                  str = find.GetFilePath();  
S>                  temp = str;
S>                  str0 = str;
       
S>                  lvItem.mask = LVIF_IMAGE|LVIF_TEXT; //Объявление и иницализация структуры
S>                  lvItem.state = 0;
S>                  lvItem.stateMask = 0 ;
S>                  lvItem.iItem = count;
S>                  lvItem.iImage= count;
S>                  lvItem.iSubItem = 0;
S>                  lvItem.pszText = T2W(str.GetBuffer(str.GetLength()));  
S>                  str.ReleaseBuffer();
S>                  lvItem.cchTextMax = str.GetLength();            
       
S>                  GetFileInfo(str);
S>                  m_list.InsertItem(&lvItem);
S>                  m_count = count++;                          
S>              }
       
S>              m_list.SetImageList(&m_list_imglist,LVSIL_NORMAL);  
       
S>              find.Close();      
S>      }
S>

S>Вот функция GetFileInfo:


S>
S>void CFilemanagerDlg::GetFileInfo(CString str,BOOL isList)
S>{
S>    SHFILEINFO FileInfo;
S>    memset(&FileInfo,0,sizeof(FileInfo));
S>    HICON hIcon;

S>    HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(str, GetFileAttributes(str),&FileInfo, sizeof( FileInfo ),SHGFI_ICON);    
S>    int inx = FileInfo.iIcon;
S>    hIcon = FileInfo.hIcon;

S>    if(isList)
S>        m_list_imglist.Add(hIcon);    
S>    else
S>        m_tree_imglist.Add(hIcon);    
S>    DestroyIcon(hIcon);
S>}
S>


В структуре LVITEM задается не количество иконок, а номер иконки в IMAGELIST-е. И второе: походи по разным папкам минут десять, например позаходи в system32 раз 50,
и думаю перестанут иконки подгружаться через некоторое время.
Re[7]: Непонятки с SHGetFileInfo()...
От: spacetime  
Дата: 28.05.11 04:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, spacetime, Вы писали:


S>>Здравствуйте, spacetime, Вы писали:


S>>>Здравствуйте, De-Bugger, Вы писали:


DB>>>>Здравствуйте, spacetime, Вы писали:


S>>>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?


DB>>>>Все равно не читаете документацию:


DB>>>>

DB>>>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.


DB>>>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?


S>>>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?


S>>Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится



S>>
S>>void CFilemanagerDlg::findFiles(int &count, CString &dtemp, BOOL isRefrashe)
S>>      {
S>>          CFileFind find;
S>>          count = 0;
S>>          CString temp;
S>>          HICON h;
S>>          BOOL f;
S>>          LVITEM lvItem;
S>>          int ind;    
       
S>>          temp = m_str;
S>>          str0 = temp;
S>>          dtemp = temp;
S>>          int index;
       
S>>          if(isRefrashe == true)
S>>              temp = str0;
       
S>>          f = find.FindFile(temp+"\\*");  
       
S>>              while(f)
S>>              {
S>>                  f = find.FindNextFile();
       
S>>                  if(find.IsDots())
S>>                      continue;          
       
S>>                  str = find.GetFilePath();  
S>>                  temp = str;
S>>                  str0 = str;
       
S>>                  lvItem.mask = LVIF_IMAGE|LVIF_TEXT; //Объявление и иницализация структуры
S>>                  lvItem.state = 0;
S>>                  lvItem.stateMask = 0 ;
S>>                  lvItem.iItem = count;
S>>                  lvItem.iImage= count;
S>>                  lvItem.iSubItem = 0;
S>>                  lvItem.pszText = T2W(str.GetBuffer(str.GetLength()));  
S>>                  str.ReleaseBuffer();
S>>                  lvItem.cchTextMax = str.GetLength();            
       
S>>                  GetFileInfo(str);
S>>                  m_list.InsertItem(&lvItem);
S>>                  m_count = count++;                          
S>>              }
       
S>>              m_list.SetImageList(&m_list_imglist,LVSIL_NORMAL);  
       
S>>              find.Close();      
S>>      }
S>>

S>>Вот функция GetFileInfo:


S>>
S>>void CFilemanagerDlg::GetFileInfo(CString str,BOOL isList)
S>>{
S>>    SHFILEINFO FileInfo;
S>>    memset(&FileInfo,0,sizeof(FileInfo));
S>>    HICON hIcon;

S>>    HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(str, GetFileAttributes(str),&FileInfo, sizeof( FileInfo ),SHGFI_ICON);    
S>>    int inx = FileInfo.iIcon;
S>>    hIcon = FileInfo.hIcon;

S>>    if(isList)
S>>        m_list_imglist.Add(hIcon);    
S>>    else
S>>        m_tree_imglist.Add(hIcon);    
S>>    DestroyIcon(hIcon);
S>>}
S>>


А>В структуре LVITEM задается не количество иконок, а номер иконки в IMAGELIST-е. И второе: походи по разным папкам минут десять, например позаходи в system32 раз 50,

А>и думаю перестанут иконки подгружаться через некоторое время.

Все прекрасно работает. Испытал вчера никаких проблем. А это количество у мена написано индекс это так так сказать динамическое количество в теле функции findFiles оно все время растет то есть это на самом деле индекс.
Re[8]: Непонятки с SHGetFileInfo()...
От: spacetime  
Дата: 28.05.11 05:03
Оценка:
Здравствуйте, spacetime, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, spacetime, Вы писали:


S>>>Здравствуйте, spacetime, Вы писали:


S>>>>Здравствуйте, De-Bugger, Вы писали:


DB>>>>>Здравствуйте, spacetime, Вы писали:


S>>>>>> HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(sPath, GetFileAttributes(sPath),&FileInfo, sizeof( FileInfo ),SHGFI_ICON | SHGFI_LARGEICON | S>Что можно еще делать ?


DB>>>>>Все равно не читаете документацию:


DB>>>>>

DB>>>>>If uFlags does not include the SHGFI_USEFILEATTRIBUTES flag, this parameter is ignored.


DB>>>>>Но проблему это не решит. В отладчике, sPath точно всегда разный? А .hIcon ?


S>>>>В отладчике неоднократно проверял sPath всегда разный и соответствующий.А вот .hIcon честно говоря не понимаю какое значения принимает этот параметр. В отладчике всегда рядом с .hIcon пишет что то типо "unused ???????" или 0x002e05f5 (unused-14823154), хотя в других правильно работающих программах тоже так пишет (сам проверял). Я думаю может собака зарыта в m_list.InsertItem(hIcon)??? . Может надо с помощью LVITEM структуры делать insertItem и в структуре указать количество iItem, потому что возможно без объявлении струйтуры iItem default-ом идет 1?. Что вы думаете ?


S>>>Проблему решыл :D Дело в том что если мы делаем insertItem(hIcon) то по default-у iImage и iImage ставляются 1 то есть для всех файлов будет одна иконка а когда делаем insertItem с помощью LVITEM lvItem структуры insertItem(&lvItem) и в структуре указываем количество iImage и iImage проблема решается и у каждого файла отображается своя иконка. Вот код может кому прогодится



S>>>
S>>>void CFilemanagerDlg::findFiles(int &count, CString &dtemp, BOOL isRefrashe)
S>>>      {
S>>>          CFileFind find;
S>>>          count = 0;
S>>>          CString temp;
S>>>          HICON h;
S>>>          BOOL f;
S>>>          LVITEM lvItem;
S>>>          int ind;    
       
S>>>          temp = m_str;
S>>>          str0 = temp;
S>>>          dtemp = temp;
S>>>          int index;
       
S>>>          if(isRefrashe == true)
S>>>              temp = str0;
       
S>>>          f = find.FindFile(temp+"\\*");  
       
S>>>              while(f)
S>>>              {
S>>>                  f = find.FindNextFile();
       
S>>>                  if(find.IsDots())
S>>>                      continue;          
       
S>>>                  str = find.GetFilePath();  
S>>>                  temp = str;
S>>>                  str0 = str;
       
S>>>                  lvItem.mask = LVIF_IMAGE|LVIF_TEXT; //Объявление и иницализация структуры
S>>>                  lvItem.state = 0;
S>>>                  lvItem.stateMask = 0 ;
S>>>                  lvItem.iItem = count;
S>>>                  lvItem.iImage= count;
S>>>                  lvItem.iSubItem = 0;
S>>>                  lvItem.pszText = T2W(str.GetBuffer(str.GetLength()));  
S>>>                  str.ReleaseBuffer();
S>>>                  lvItem.cchTextMax = str.GetLength();            
       
S>>>                  GetFileInfo(str);
S>>>                  m_list.InsertItem(&lvItem);
S>>>                  m_count = count++;                          
S>>>              }
       
S>>>              m_list.SetImageList(&m_list_imglist,LVSIL_NORMAL);  
       
S>>>              find.Close();      
S>>>      }
S>>>

S>>>Вот функция GetFileInfo:


S>>>
S>>>void CFilemanagerDlg::GetFileInfo(CString str,BOOL isList)
S>>>{
S>>>    SHFILEINFO FileInfo;
S>>>    memset(&FileInfo,0,sizeof(FileInfo));
S>>>    HICON hIcon;

S>>>    HIMAGELIST hImg = (HIMAGELIST)SHGetFileInfo(str, GetFileAttributes(str),&FileInfo, sizeof( FileInfo ),SHGFI_ICON);    
S>>>    int inx = FileInfo.iIcon;
S>>>    hIcon = FileInfo.hIcon;

S>>>    if(isList)
S>>>        m_list_imglist.Add(hIcon);    
S>>>    else
S>>>        m_tree_imglist.Add(hIcon);    
S>>>    DestroyIcon(hIcon);
S>>>}
S>>>


А>>В структуре LVITEM задается не количество иконок, а номер иконки в IMAGELIST-е. И второе: походи по разным папкам минут десять, например позаходи в system32 раз 50,

А>>и думаю перестанут иконки подгружаться через некоторое время.

S>Все прекрасно работает. Испытал вчера никаких проблем. А это количество у мена написано индекс это так так сказать динамическое количество в теле функции findFiles оно все время растет то есть это на самом деле индекс.

Извените в "А это количество у мена написано индекс" не индекс a count
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.