Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];

Вниз

Ресурсы   Найти похожие ветки 

 
Esa   (2002-03-13 10:29) [0]

Здравствуйте.
Дано: извлеченные из EXEшника или DLLки ресурсы в том виде, в котором они храняться в файле.
Требуется: преобразовать их в понятный человеку вид (например, CURSOR сохранить в виде файла *.CUR; MENU или DIALOG загрузить в окошко или на крайний случай сохранить в RC-формате и т.д.).

Неужели для этого необходимо изучать форматы ресурсов и вручную их форматировать. Должны же быть какие-то готовые функции. Либо есть API-функции для вытягивания конкретного ресурса, зная его ID или имя?

Спасибо всем, кто ответит


 
Fellomena   (2002-03-13 10:36) [1]

Во-первых с Delphi иногда поставляется прога, которая извлекает ресурсы из всего чего угодно (WorkShope называется вроде - не помню точно).
А во-вторых, есть API ф-ии, позволяющие извлекать ресурсы и сохранять их в нужном виде (см. SDK).


 
Fellomena   (2002-03-13 10:38) [2]

Пример из Королевства:

Вопрос:
Извлечение пиктограммы из exe, dll или ico-файла
Ответ:
Функция SHELLAPI ExtractIconEx:
Обратите внимание - в примере функции обьявленны иначе, чем в модуле ShellAPI

type ThIconArray = array[0..0] of hIcon;
type PhIconArray = ^ThIconArray;

function ExtractIconExA(lpszFile: PAnsiChar;
nIconIndex: Integer;
phiconLarge : PhIconArray;
phiconSmall: PhIconArray;
nIcons: UINT): UINT; stdcall;
external "shell32.dll" name "ExtractIconExA";

function ExtractIconExW(lpszFile: PWideChar;
nIconIndex: Integer;
phiconLarge: PhIconArray;
phiconSmall: PhIconArray;
nIcons: UINT): UINT; stdcall;
external "shell32.dll" name "ExtractIconExW";

function ExtractIconEx(lpszFile: PAnsiChar;
nIconIndex: Integer;
phiconLarge : PhIconArray;
phiconSmall: PhIconArray;
nIcons: UINT): UINT; stdcall;
external "shell32.dll" name "ExtractIconExA";


procedure TForm1.Button1Click(Sender: TObject);
var
NumIcons : integer;
pTheLargeIcons : phIconArray;
pTheSmallIcons : phIconArray;
LargeIconWidth : integer;
SmallIconWidth : integer;
SmallIconHeight : integer;
i : integer;
TheIcon : TIcon;
TheBitmap : TBitmap;
begin
NumIcons :=
ExtractIconEx("C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe",
-1,
nil,
nil,
0);
if NumIcons > 0 then begin
LargeIconWidth := GetSystemMetrics(SM_CXICON);
SmallIconWidth := GetSystemMetrics(SM_CXSMICON);
SmallIconHeight := GetSystemMetrics(SM_CYSMICON);
GetMem(pTheLargeIcons, NumIcons * sizeof(hIcon));
GetMem(pTheSmallIcons, NumIcons * sizeof(hIcon));
FillChar(pTheLargeIcons^, NumIcons * sizeof(hIcon), #0);
FillChar(pTheSmallIcons^, NumIcons * sizeof(hIcon), #0);
ExtractIconEx("C:\Program Files\Borland\Delphi 3\BIN\delphi32.exe",
0,
pTheLargeIcons,
pTheSmallIcons,
numIcons);
{$IFOPT R+}
{$DEFINE CKRANGE}
{$R-}
{$ENDIF}
for i := 0 to (NumIcons - 1) do begin
DrawIcon(Form1.Canvas.Handle,
i * LargeIconWidth,
0,
pTheLargeIcons^[i]);
TheIcon := TIcon. Create;
TheBitmap := TBitmap.Create;
TheIcon.Handle := pTheSmallIcons^[i];
TheBitmap.Width := TheIcon.Width;
TheBitmap.Height := TheIcon.Height;
TheBitmap.Canvas.Draw(0, 0, TheIcon);
TheIcon.Free;
Form1.Canvas.StretchDraw(Rect(i * SmallIconWidth,
100,
(i + 1) * SmallIconWidth,
100 + SmallIconHeight),
TheBitmap);
TheBitmap.Free;
end;
{$IFDEF CKRANGE}
{$UNDEF CKRANGE}
{$R+}
{$ENDIF}
FreeMem(pTheLargeIcons, NumIcons * sizeof(hIcon));
FreeMem(pTheSmallIcons, NumIcons * sizeof(hIcon));
end;
end;

end.


 
Nebula   (2002-03-13 11:46) [3]

Скачай любой редактор ресурсов. Хотя-бы Restorator.


 
Esa   (2002-03-13 14:04) [4]

Вопрос не в этом. У меня есть и Restorator, и ResourceHacker, и Resource WorkShop. Но мне необходимо преобразовать уже вытащенные ресурсы в бинарном виде в удобочитаемый вид. Либо же вытащить их, но функции типа ExtractIconEx вытаскивает их подряд (причем, если например в одном GROUP_ICON указано несколько иконок, эта функция вытащит только одну из них), а мне надо вытащить только конкретный ресурс с конкретным идентификатором.
Кроме того, по возможности мне нужно загрузить ресурс в мою программу, но не из RC-файла, а из файла, в котором ресурс представлен в компиллированном виде. Если кто знает, хотя бы намекающий пример приведите.
Хотелось бы также получить ссылку на описание формата ресурсов, которого ни в какой документации нет. Спасибо за внимание.


 
gek   (2002-03-13 15:16) [5]

Есть же в Delphi пример - ResXplor


 
Иван Шихалев   (2002-03-13 17:07) [6]

Формат ресурсов в SDK есть.

Конечно, ExtractIcon никакого отношения к данной задаче не имеет... А имеют отношение следующие функции FindResource, LockResource, LoadResource и иже с ними. Особенно рекомендую обратить внимание на LoadImage. Пример (только по иконкам) есть в кладовке - лично мой Icon Extractor.


 
Esa   (2002-03-14 14:11) [7]

Спасибо за советы. Нашел я ResXplor, только он очень сложный, впрочем как и Icon Extractor (между прочим, тоже вытаскивает не все иконки). Сами понимаете, как тяжело разбираться в чужих программах. Частично помогло, но ResXplor не все ресурсы представляет в необходимом виде. Но все равно хорошо.
А в SDK описания форматов ресурсов нет, как ни крути.


 
Иван Шихалев   (2002-03-14 18:01) [8]

> между прочим, тоже вытаскивает не все иконки

Не все иконки, или не из всех файлов? Должен все, но только из 32-битных exe и dll.

> А в SDK описания форматов ресурсов нет, как ни крути.

А я, интересно, откуда взял? Крутить, конечно, надо капитально - некоторые вещи решаются экспериментально, но в общем виде все есть.

А ResXplor действительно сложен, хотя бы потому, что извлекает ресурсы не средствами WinAPI, а выдирая из файла, то есть ему приходится использовать внутренний формат PE.


 
Esa   (2002-03-15 09:43) [9]

> Должен все
Обрати внимание, что количество иконок, указанное в ресурсе GROUP_ICON часто меньше, чем в ICON; т.е. несколько иконок относятся к одной группе. Обычно эти иконки похожи и отличаются только размером или палитрой, но не всегда. Твоя же прога вытаскивает лишь только первую иконку из такой группы. Вот так. Также работает и API-функция ExtractIcon.

> но только из 32-битных exe и dll
А вытаскиваются иконки не только из exe и dll, а из любого PE-файла.

> А я, интересно, откуда взял?
Но вот где ты взял, я не пойму. Конкретного описания я не нашел. Наверное, мы по разному воспринимаем смысл этой фразы. Под описанием формата ресурса я подразумеваю структуру и размеры полей конкретного скомпилированного ресурса (короче, что какой байтик или битик там значит).


 
Иван Шихалев   (2002-03-15 12:27) [10]

> Обрати внимание, что количество иконок,
> указанное в ресурсе GROUP_ICON часто меньше,
> чем в ICON; т.е. несколько иконок относятся
> к одной группе. Обычно эти иконки похожи и
> отличаются только размером или палитрой,
> но не всегда. Твоя же прога вытаскивает лишь
> только первую иконку из такой группы. Вот так.


Специально проверил. Вытаскивает все. Естественно, группируя, как записано в GROUP_ICON. То есть, .ico-файл содержит все соответствующие изображения, а не одно.


 
Esa   (2002-03-18 13:30) [11]

Извини, брат, может быть. Только как посмотреть все иконки?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.05.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.006 c
3-64469
boogier
2002-04-22 09:05
2002.05.20
Перекодировка DOS-WIN в T-SQL


6-64755
Diablo
2002-01-23 15:47
2002.05.20
Нужна помощь


14-64820
vopros
2002-04-11 17:14
2002.05.20
vopros ты меня достал уже.


14-64831
maxnovikov
2002-04-11 07:40
2002.05.20
Object constructors? Very interesting! :)


1-64581
cult
2002-05-07 14:48
2002.05.20
Знаете ли вы RichEdit?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский