![Старый](images/statusicon/post_old.gif)
31.07.2010, 08:22
|
Начинающий
|
|
Регистрация: 10.02.2008
Сообщения: 136
Версия Delphi: XE2
Репутация: 41
|
|
Замена ресурсов...
Помогите... Всю ночь пытался!!! Нужно каким то образом прочитать ресурс из exe файла в переменные, а потом этот же ресурс записать в этот же exe файл только под другим именем... Что только не пробывал... Ничего не получается!!! Вот к чему я пришел, но ничего не работает...
Код:
var
LoadLib: THandle;
Sl: TStringList;
LockRes: Array of PChar;
SizeOfRes: Array of DWord;
function StockResourceType(ResType: PChar): string;
begin
if ResType = PChar(14) then
Result:='RT_GROUP_ICON';
end;
function EnumResNamesProc(Module: HMODULE; ResType, ResName: PChar; Ts: TStrings): Integer; stdcall;
begin
if (StockResourcetype(ResType) = 'RT_GROUP_ICON') then
begin
if HiWord(Cardinal(ResName)) <> 0 then
Ts.Add(ResName)
else
Ts.Add(Format('%d', [LoWord(Cardinal(ResName))]));
end;
Result:=1;
end;
function EnumResTypesProc(Module: HMODULE; ResType: PChar; Ts: TStrings): Integer; stdcall;
begin
if (StockResourcetype(ResType) = 'RT_GROUP_ICON') then
begin
EnumResourceNames(Module, ResType, @EnumResNamesProc, Integer(Ts));
end;
Result:=1;
end;
procedure CopyRes;
var
FindRes, LoadRes: HRSRC;
I: Integer;
begin
LoadLib:=LoadLibrary(PChar('c:\calc.exe'));
Sl:=TStringList.Create;
EnumResourceTypes(LoadLib, @EnumResTypesProc, Integer(Sl));
SetLength(SizeOfRes, Sl.Count);
SetLength(LockRes, Sl.Count);
for I:=0 to Sl.Count - 1 do
begin
FindRes:=FindResource(LoadLib, MakeIntResource(PChar(Sl.Strings[i])), RT_GROUP_ICON);
if FindRes = 0 then
FindRes:=FindResource(LoadLib, MakeIntResource(StrToInt(Sl.Strings[i])), RT_GROUP_ICON);
LoadRes:=LoadResource(LoadLib, FindRes);
LockRes[i]:=LockResource(LoadRes);
SizeOfRes[i]:=SizeOfResource(LoadLib, FindRes);
end;
FreeLibrary(LoadLib);
end;
procedure PasteRes;
var
I: Integer;
BeginUpdateRes: THandle;
begin
LoadLib:=LoadLibrary(PChar('c:\calc.exe'));
for I:=0 to Sl.Count - 1 do
begin
BeginUpdateRes:=BeginUpdateResource(PChar('c:\calc.exe'), False);
UpdateResource(BeginUpdateRes, RT_GROUP_ICON, MakeIntResource(PChar('Новое имя')),
LangId(nil), LockRes[i], SizeOfRes[i]);
EndUpdateResource(BeginUpdateRes, False);
end;
FreeLibrary(LoadLib);
end;
Нужно что бы можно было работать с этим файлом в промежутке между двумя процедурами!!! Например его править или вообще удалить... Просто иначе к нему нету доступа... Теоретически данный код должен работать... Но че то никак... Заранее большое ПАСИБ... ![Печаль](images/smilies/frown.gif)
Последний раз редактировалось Romix, 31.07.2010 в 09:17.
|