Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Как по расширению файла получить хендл иконки


Автор: Alca 29.10.2009, 17:03
По расширению файла получить хендл иконки? Т.е. получить иконки связанные с конкретным типом файла.

Добавлено через 2 минуты и 31 секунду
Кроме как из реестра выдрать можно?

Автор: smoke_man 29.10.2009, 20:26
Попробуй так:
Код

UnicodeString path = "";
    if(!OpenDialog1->Execute())
        return;
    path = OpenDialog1->FileName;

    SHFILEINFOW info;

    SHGetFileInfoW(path.w_str(), FILE_ATTRIBUTE_NORMAL, &info, sizeof(info),
    SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | SHGFI_SMALLICON);
    ICONINFO stIconInfo;
    GetIconInfo(info.hIcon, &stIconInfo);
    HBITMAP hBmp = stIconInfo.hbmColor;

    Image1->Picture->Bitmap->Handle = hBmp;
    DestroyIcon(info.hIcon);

Автор: Alca 29.10.2009, 22:32
Файла нет на диске, есть только имя. И по расширению надо достать иконку (хендл).

Автор: smoke_man 29.10.2009, 22:48
А почему бы для этого не использовать реестр?

Автор: A5uKa 29.10.2009, 22:50
Цитата(Alca @ 29.10.2009,  22:32)
Файла нет на диске, есть только имя. И по расширению надо достать иконку (хендл).

Создать файл   smile 
Хотя мне кажется без реестра не обойдётся ...

Автор: Alca 29.10.2009, 22:52
кривой результат получается, для некоторых расширений не могу получить хендл иконки.
Код

#include <registry.hpp>
//---------------------------------------------------------------------------
HICON hGetAssociatedIcon(const tString &csFileExt) {               

    bool  bRes = false;
    int   iRes = - 1;

    tString sTemp = csFileExt;

    if (_T('.') != sTemp[1]) {
        sTemp = _T(".") + sTemp;
    }

    std::auto_ptr<TRegistry> apregReg(new TRegistry());
    /*debug*/XASSERT(NULL != apregReg.get());
    
    apregReg->RootKey = HKEY_LOCAL_MACHINE;
    
    bRes = apregReg->OpenKey(_T("Software\\CLASSES"), false);
    /*DEDUG*/XASSERT(true == bRes);
    
    bRes = apregReg->OpenKey(sTemp, false);
    /*DEDUG*/XASSERT(true == bRes);
    
    sTemp = apregReg->ReadString(_T(""));    //(Default)
    /*DEDUG*/XASSERT(false == sTemp.IsEmpty());
    
    bRes = apregReg->OpenKey(_T("\\Software\\CLASSES\\") + sTemp + _T("\\DefaultIcon"), false);
    /*DEDUG*/XASSERT(true == bRes);

    sTemp  = apregReg->ReadString("");
    /*DEDUG*/XASSERT(true == bRes);
    
    if (sTemp == _T("%1") || sTemp == _T("\"%1\"")) {
        return NULL;
    }

    int iPos   = sTemp.LastDelimiter(_T(","));
    int iIndex = sTemp.SubString(iPos + 1, sTemp.Length() - iPos).ToInt();

    sTemp.Delete(iPos, sTemp.Length() - iPos + 1).Trim();

    //удаляем кавычки
    if ('"' == sTemp[1]) {
        sTemp.Delete(1, 1);        
    }
    if ('"' == sTemp[sTemp.Length()]) {
        sTemp.Delete(sTemp.Length(), 1);        
    } 
    //ShowMessage(sTemp);

    HICON hIconLarge = NULL; 
    HICON hIconSmall = NULL;
    iRes = ::ExtractIconEx(sTemp.c_str(), 0, &hIconLarge, &hIconSmall, 1); 
    /*DEDUG*/XASSERT(- 1 != iRes); 
    
    return hIconSmall; 
}
//---------------------------------------------------------------------------


Добавлено через 35 секунд
Иконки нужны для TListView

Автор: smoke_man 29.10.2009, 23:04
Посмотри еще http://www.codeproject.com/KB/cs/GetFileTypeAndIcon.aspx, правда на C#, но описан алгоритм поиска.

Автор: Alca 29.10.2009, 23:12
Цитата

Посмотри еще тут, правда на C#, но описан алгоритм поиска.

У тебя случаем шарп не стоит на тачке? Хочу екзешник потестить у себя...

Автор: kemiisto 29.10.2009, 23:31
Цитата(Alca @  30.10.2009,  00:12 Найти цитируемый пост)
У тебя случаем шарп не стоит на тачке? Хлчу екзешник потестить у себя...

Капитан Очевидность предупреждает: для того, чтоб "потестить" приложение .NET, необходимо наличие .NET Framework. А его наличие гарантирует наличие компилятора С#. smile 

Автор: Alca 29.10.2009, 23:36
Цитата

апитан Очевидность предупреждает: для того, чтоб "потестить" приложение .NET, необходимо наличие .NET Framework. А его наличие гарантирует наличие компилятора С#. 

 smile

Добавлено через 46 секунд
мне че msbuild-ом компилить студийный проект ????  smile 

Автор: smoke_man 29.10.2009, 23:45
Шарп стоит установлен.

Автор: Alca 30.10.2009, 00:32
Цитата

Шарп стоит установлен.
 smile 
Можешь скомпилить пример?

Добавлено через 15 секунд
А то у меня места фанарь

Автор: smoke_man 30.10.2009, 00:36
Ща сделаемс smile

Добавлено через 4 минуты и 17 секунд
Лови.

Автор: Alca 30.10.2009, 00:41
smile

Добавлено через 1 минуту и 55 секунд
Работает корректно. Буду ковырять сорцы.
smoke_man, спасибо.

Автор: smoke_man 30.10.2009, 00:46
Не за что!

Автор: mrbrooks 30.10.2009, 08:45
Цитата(Alca @  29.10.2009,  23:36 Найти цитируемый пост)
мне че msbuild-ом компилить студийный проект ????

все проще. в фреймворках есть компилятор C#.  По этому можно скомпилировать проект из под консоли. 
Другое дело надо знать как.

Автор: Alca 30.10.2009, 10:13
Цитата

все проще. в фреймворках есть компилятор C#.  По этому можно скомпилировать проект из под консоли. 

еще и кучу ключей вписать. Проще из под среды будет.

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