crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Как из exe файла дастать иконку
Razerio
  опции профиля:
сообщение 16.1.2013, 21:47
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 16.1.2013
Пользователь №: 3677

Спасибо сказали: 1 раз(а)




Репутация:   0  


Пытаюсь в винде (Win7x64) достать иконку из exe файла. В принципе всё работает:
    QFileInfo *info = new QFileInfo("somefile.exe");
    QFileIconProvider *provider = new QFileIconProvider();
    icon = new QImage(provider->icon(*info).pixmap(32, 32).toImage());

Вот только таким методом можно получить иконку размером до 32x32. Тоесть даже если вписать ".pixmap(64, 64).", то всё-равно будет возвращено 32x32 пикселя. (Разумеется в exe файле есть иконка 64x64).

Отсюда и вопрос — как вытаскивать большие иконки?

P.S.
На Дельфях помню проблему решил используя WinAPI функцию PrivateExtractIcons
function PrivateExtractIcons(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer; phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall; external 'user32.dll' name 'PrivateExtractIconsW';
// ...
var
  mIcon: THandle;
  nIconId: DWORD;
Begin
  PrivateExtractIcons(PChar("somefile.exe"), 0, 48, 48, @mIcon, @nIconId, 1, LR_LOADFROMFILE);

Вот только как PrivateExtractIcons в Qt объявить не знаю((
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 9)
sidsukana
  опции профиля:
сообщение 17.1.2013, 6:38
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 158
Регистрация: 23.12.2010
Из: Челябинск
Пользователь №: 2296

Спасибо сказали: 10 раз(а)




Репутация:   2  


Цитата(Razerio @ 16.1.2013, 23:47) *
Пытаюсь в винде (Win7x64) достать иконку из exe файла. В принципе всё работает:
    QFileInfo *info = new QFileInfo("somefile.exe");
    QFileIconProvider *provider = new QFileIconProvider();
    icon = new QImage(provider->icon(*info).pixmap(32, 32).toImage());

Вот только таким методом можно получить иконку размером до 32x32. Тоесть даже если вписать ".pixmap(64, 64).", то всё-равно будет возвращено 32x32 пикселя. (Разумеется в exe файле есть иконка 64x64).

Отсюда и вопрос — как вытаскивать большие иконки?

P.S.
На Дельфях помню проблему решил используя WinAPI функцию PrivateExtractIcons
function PrivateExtractIcons(lpszFile: PChar; nIconIndex, cxIcon, cyIcon: integer; phicon: PHANDLE; piconid: PDWORD; nicon, flags: DWORD): DWORD; stdcall; external 'user32.dll' name 'PrivateExtractIconsW';
// ...
var
  mIcon: THandle;
  nIconId: DWORD;
Begin
  PrivateExtractIcons(PChar("somefile.exe"), 0, 48, 48, @mIcon, @nIconId, 1, LR_LOADFROMFILE);

Вот только как PrivateExtractIcons в Qt объявить не знаю((

Чем WinAPI на дельфях отличается от C++ ? Ничем практически, ищите такую же функцию WinAPI на C++
вот она http://msdn.microsoft.com/ru-ru/library/wi...5(v=vs.85).aspx
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Razerio
  опции профиля:
сообщение 17.1.2013, 9:47
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 16.1.2013
Пользователь №: 3677

Спасибо сказали: 1 раз(а)




Репутация:   0  


sidsukana, так проблема банальна. Я просто не знаю как её использовать. Например:
    QLibrary uLib("user32");
    typedef unsigned int (*PrivateExtractIcons)(QString lpszFile, int nIconIndex, int cxIcon, int cyIcon, HICON *phicon,
                                       unsigned int *piconid, unsigned int nIcons, unsigned int flags);
    PrivateExtractIcons PrivateExtractIconsFunction = (PrivateExtractIcons) uLib.resolve("PrivateExtractIconsW");
    if(PrivateExtractIconsFunction)
    {        
        HICON *phi;
        unsigned int *pii;
        PrivateExtractIconsFunction("somefile.exe", 0, 48, 48, phi, pii, 1, 16);  //Программа крашится тут

    }

Что я не правильно сделал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.1.2013, 10:53
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


так там далеко не QString , а (в случае W) - wchar_t*

вызов

PrivateExtractIconsW(L"somefile.exe",


и ещё неплохо бы указать WINAPI для порядка укладывания в стек )

определено как
#define WINAPI __stdcall

в итоге, как-то так
typedef uint32_t (__stdcall *td_PrivateExtractIconsW)
(
     wchar_t*lpszFile
    ,int32_t nIconIndex
    ,int32_t cxIcon
    ,int32_t cyIcon
    ,HICON *phicon
    ,uint32_t *piconid
    ,uint32_t nIcons
    ,uint32_t flags
);


ещё момент - по идее, подключить бы такие заголовки

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <Winuser.h>


да вызывать функцию сразу :)

::PrivateExtractIconsW(...);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Razerio
  опции профиля:
сообщение 17.1.2013, 11:32
Сообщение #5


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 16.1.2013
Пользователь №: 3677

Спасибо сказали: 1 раз(а)




Репутация:   0  


Алексей1153, большое спасибо, всё заработало:
    QLibrary uLib("user32");
    typedef uint32_t (__stdcall *td_PrivateExtractIconsW)
    (
         wchar_t*lpszFile
        ,int32_t nIconIndex
        ,int32_t cxIcon
        ,int32_t cyIcon
        ,HICON *phicon
        ,uint32_t *piconid
        ,uint32_t nIcons
        ,uint32_t flags
    );
    td_PrivateExtractIconsW PrivateExtractIconsFunction = (td_PrivateExtractIconsW) uLib.resolve("PrivateExtractIconsW");
    if(PrivateExtractIconsFunction)
    {
        uint32_t pii;
        HICON phi;
        PrivateExtractIconsFunction(L"somefile.exe", 0, 48, 48, &phi, &pii, 1, 16);
        /// ...
        DestroyIcon(phi);
    }

А насчёт подключения заголовка "Winuser.h", то это я пробовал. Вот только функции PrivateExtractIcons там почему то нету. По этому и пришлось городить костыли с явной загрузкой либы и т.д.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.1.2013, 11:39
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Цитата(Razerio @ 17.1.2013, 14:32) *
Вот только функции PrivateExtractIcons там почему то нету


вполне возможно:

Цитата
This function was not included in the SDK headers and libraries until Windows XP Service Pack 1 (SP1) and Windows Server 2003. If you do not have a header file and import library for this function, you can call the function using LoadLibrary and GetProcAddress.

всё зависит от версии хедера

кстати, попробуй импортировать из User32.lib - подключи в pro
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Razerio
  опции профиля:
сообщение 17.1.2013, 12:36
Сообщение #7


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 16.1.2013
Пользователь №: 3677

Спасибо сказали: 1 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 17.1.2013, 12:39) *
попробуй импортировать из User32.lib - подключи в pro

Подключить то подключил, а импортировать то как? Ведь .h файл нужен, ли его самому написать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.1.2013, 12:44
Сообщение #8


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


должно быть так (в pro)

LIBS+= User32


заголовочник в pro не надо

Сообщение отредактировал Алексей1153 - 17.1.2013, 12:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Razerio
  опции профиля:
сообщение 17.1.2013, 13:18
Сообщение #9


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 16.1.2013
Пользователь №: 3677

Спасибо сказали: 1 раз(а)




Репутация:   0  


Сделал. Вот только я не понимаю зачем мне нужна user32.lib в pro файле? И без этого работало ведь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 17.1.2013, 18:48
Сообщение #10


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Razerio, если ты загружаешь функцию динамически, то не нужна
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 2.12.2024, 10:48