Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых)

 eXeL@B —› Программирование —› Замена ресурсов в приложении (Delphi)
Посл.ответ Сообщение


Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 19 мая 2006 15:44
· Личное сообщение · #1

Никто не сталкивался?
Нужно заменить некоторые ресурсы в проге по их именам, сам написал алго, он работает под XP, а под 2K ны выходе получается битый EXE'шник
Уже как только не пробовал, все равно бытый получается.
Причем те же действия (на апи пишу) из-под сей нормально прокатывают, ресурсы и под 2k заменяются...

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.





Ранг: 78.6 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 19 мая 2006 16:13
· Личное сообщение · #2

замена на какой стадии компиляции, выполнения? непонятно




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 19 мая 2006 16:23
· Личное сообщение · #3

В чужом EXE'шнике, не в своем.
Во время выполнения моей проги, из нее же.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.





Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 31 мая 2006 13:35
· Личное сообщение · #4

Все, разобрался, написал алго на апях из-под сей и в dllку это все заколбасил, а юзаю дллку из делфей при необходимости

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.




Ранг: 9.5 (гость)
Активность: 0.010
Статус: Участник

Создано: 31 мая 2006 17:11
· Личное сообщение · #5

Интересно а кто нибудь изменял ресурсы к примеру в чужейном дельфовом ехешнике, что бы после "сохранения" подправленных ресурсов он работал ? если кто делал расскажите, интересно было бы узнать как подобное провернуть!




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 31 мая 2006 18:11
· Личное сообщение · #6

Я это и сделал, все работает.
Все делается апёвскими методами.

-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.




Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 01 июня 2006 05:55
· Личное сообщение · #7

[DR] пишет:
чужейном

4kusNick пишет:
апёвскими


где берете такую траву? ;)




Ранг: 748.2 (! !), 390thx
Активность: 0.370
Статус: Участник
bytecode!

Создано: 01 июня 2006 10:03
· Личное сообщение · #8

Если подробнее, то делал так:
На сях писал либу.
Вот ее исходник:
// ResDll.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}

extern "C" bool CALLBACK ReplaceResource(PCHAR sSource,PCHAR sDest,PCHAR sType,PCHAR sName)
{
// Переменные для чтения и добавления ресурса
HANDLE hFile;
DWORD dwFileSize,
dwBytesRead;
LPBYTE lpBuffer;

// Открываем файл для дальнейшего чтения
hFile = CreateFile(sSource,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NO RMAL,NULL);
// Если открыть не удалось, то выходим
if(hFile == INVALID_HANDLE_VALUE) return FALSE;
// Сохраняем его размер
dwFileSize = GetFileSize(hFile, NULL);
// Если не удалось получить размер, то выходим
if(dwFileSize <= NULL)
{
// Закрываем хендл файла
CloseHandle(hFile);
return FALSE;
}

// Создаём массив для чтения файла
lpBuffer = new BYTE[dwFileSize];

if (ReadFile(hFile,lpBuffer,dwFileSize,&dwBytesRead,NULL) != FALSE)
{
HANDLE hResource;

hResource = BeginUpdateResource(sDest,FALSE);
if (NULL != hResource)
{
if (UpdateResource(hResource,sType,sName,0,(LPVOID)lpBuffer,dwFileSize)!= FALSE)
{
EndUpdateResource(hResource, FALSE);
}
}
}
delete [] lpBuffer;
CloseHandle(hFile);
return true;
}

//ResDll.h

#define EXPORT extern "C" __declspec (dllexport)
EXPORT bool CALLBACK ReplaceResource(PCHAR sSource,PCHAR sDest,PCHAR sType,PCHAR sName);

//ResDll.def
LIBRARY ResDll
EXPORTS
ReplaceResource @1


Затем юзал эту дллку из-под делфей:
unit xxx...
...
// объявил
function ReplaceResource(sSource,sDest,sType,sName: PChar): Boolean; cdecl; far; external 'ResDll.dll';
...
//и потом юзал
ReplaceResource(PChar('C:\data.dat'),PChar(sTempPath + '1.tmp'),RT_RCDATA,'MAINDATA');
// это заменит в файле 1.tmp (он должен быть валидным PE файлом, кажись) ресурс с именем MAINDATA /////(вместо того, что было, появится содержимое файла data.dat в ресурсе MAINDATA в файле 1.tmp)


-----
Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску.




Ранг: 450.1 (мудрец)
Активность: 0.260
Статус: Участник

Создано: 01 июня 2006 17:13
· Личное сообщение · #9

4kusNick пишет:
Затем юзал эту дллку из-под делфей


а что на делфи нельзя написать и обойтись без ДЛЛ?



Ранг: 42.4 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 04 июня 2006 07:55
· Личное сообщение · #10

А нельзя использовать прогу вроде ResHacker? Или обязательно автоматически надо?



Ранг: 5.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 07 июня 2006 06:51
· Личное сообщение · #11

У меня где-то был исходник проги типа Restorator, как найду выложу




Ранг: 81.2 (постоянный)
Активность: 0.040
Статус: Участник

Создано: 08 июня 2006 02:08
· Личное сообщение · #12

было бы интеересно на это глянуть, я про исходники




Ранг: 111.1 (ветеран)
Активность: 0.040
Статус: Участник

Создано: 08 июня 2006 16:53
· Личное сообщение · #13

У меня есть исходник по работе с ресурсами (показывает их и сохраняет). Могу выложить. Правда написан он на Visual Basic 6.0, но там работа с ресурсами идет на чистом API, так что разобраться будет несложно.

-----
The truth is out of there...




Ранг: 54.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 08 июня 2006 18:07
· Личное сообщение · #14

4kusNick
На делфи тоже можно менять ресурсы. Ниже код который использовал для замены иконки, переделать не сложно.
...;
var
hModule : Cardinal;
hResFind : Cardinal;
hResLoad : Cardinal;
pResLock : PChar;
hResUpdate: Cardinal;
begin
Result := false;
hModule := LoadLibrary(PChar(FSourceFile));
if hModule = 0 then
Exit;
try
hResFind := FindResource(hModule, MakeIntResource(SourceIndex+1), RT_ICON);
if hResFind = 0 then Exit;
hResLoad := LoadResource(hModule, hResFind);
if hResLoad = 0 then Exit;
pResLock := LockResource(hResLoad);
if pResLock = nil then Exit;
hResUpdate := BeginUpdateResource(PChar(FDestFile), false);
if hResUpdate = 0 then Exit;
if not UpdateResource(hResUpdate,
RT_ICON,
MakeIntResource(DestIndex + 1),
0, //local language
pResLock,
SizeofResource(hModule, hResFind)) then Exit;

if not EndUpdateResource(hResUpdate, false) then Exit;
finally
FreeLibrary(hModule);
end;
Result := true;
end;




Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 08 июня 2006 21:32
· Личное сообщение · #15

на radasm заходите и качаете ResEd (редактор ресурсов), он с исходниками, правда на асме



Ранг: 5.0 (гость)
Активность: 0.010
Статус: Участник

Создано: 09 июня 2006 08:50
· Личное сообщение · #16

Вот примерчик на Delphi, ксати взят из демок. Сохранять не умеет, но может допрет кто-нить


69ba_09.06.2006_CRACKLAB.rU.tgz - ResXplor.rar




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 09 июня 2006 13:25
· Личное сообщение · #17

На нем ResHacker сделан.

-----
Yann Tiersen best and do not fuck



 eXeL@B —› Программирование —› Замена ресурсов в приложении (Delphi)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати