Форум: "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