Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2011, 22:15   #1
cargo29
Форумчанин
 
Регистрация: 13.12.2010
Сообщений: 603
Восклицание Как сменить иконку у любого файла ЕХЕ

Как программно сменить иконку у любого файла ЕХЕ??? именно надо программно.. без всяких модулей

нашел тут юнит и посмотрел код он беред иконку из одного ЕХЕ и меняет ее у другого ЕХЕ

Можно ли ее как то переделать???
Код:
unit MainIcon;

interface

uses Windows;
function ChangeMAINICON(SourceExe, TargetExe: String): Boolean;
implementation
////////////////////////////////////////////////////////////////////////////////
// Аналог макроса MAKELANGID в С++ //
// Возвращает языковой идетификатор //
////////////////////////////////////////////////////////////////////////////////
function MAKELANGID(p :DWORD ;s : DWORD) : LANGID;
begin
Result := (s shl 10) or (p);
end;
////////////////////////////////////////////////////////////////////////////////
// Функция GetMAINICONLanguage получает имя exe-файла и возвращает //
// языковой идетификатор его главной иконки //
////////////////////////////////////////////////////////////////////////////////
function GetMAINICONLanguage(const sFileName: String): LANGID;
// Функция обратного вызова. Вызывается для каждого языкового
// идентификатора данного ресурса. В lParam ей передаю указатель на переменную,
// в которую возвратится результат.
function EnumResLangProc(hModule: THandle; lpszType: PChar;
lpszName: PChar; wIDLanguage: WORD;
lParam: Pointer): BOOL; stdcall;
begin
PWORD(lParam)^ := wIDLanguage;
Result := False; // После первого вызова сразу прекращаем перебор,
// т.к. не видел ни одной проги с разными иконками под разные языки
end;

var hExe: THandle;
begin
hExe := LoadLibrary(PChar(sFileName)); // Загружаю файл.
// Запускаю перебор языков главной иконки
EnumResourceLanguages(hExe, RT_ICON, MakeIntResource(1),
@EnumResLangProc, LPARAM(@Result));
FreeLibrary(hExe); // Выгружаю файл
end;
////////////////////////////////////////////////////////////////////////////////
// ::: Функция ChangeMAINICON ::: //
// //
// Зачада: Изменяет главную иконку целевого exe-файла, на главную //
// иконку исходного файла путем правки ресурсов. //
// (пока под главной иконкой подразумевается иконка //
// с индексом = 1) //
// //
// Входные данные: SourceExe, TargetExe - текстовые строки с путями к //
// исходному и целевому exe-фаайлам. //
// //
// Выходные данные: True - замена иконки произошла успешно, //
// False - ошибка, замена не произошла. //
////////////////////////////////////////////////////////////////////////////////
function ChangeMAINICON(SourceExe, TargetExe: String): Boolean;
var
hResLoad, hRes: HRSRC;
hExe, hUpdateRes: THandle;
lpResLock: PChar;
begin
Result := False;
// Загружаем источник иконки как библиотеку (с ресурсами)
hExe := LoadLibrary(PChar(SourceExe));
if hExe = 0 then Exit;
try
// Ищем в источнике главную иконку
hRes := FindResource(hExe, MakeIntResource(1), RT_ICON);
if hRes = 0 then Exit;
// Загружаем иконку
hResLoad := LoadResource(hExe, hRes);
if hResLoad = 0 then Exit;
// Лочим ресурс иконки. Получаем указатель не ее данные.
lpResLock := LockResource(hResLoad);
if lpResLock = nil then Exit;
// Открываем TargetExe для редактирования ресурсов
hUpdateRes := BeginUpdateResource(PChar(TargetExe), False);
if hUpdateRes = 0 then Exit;
// Заменяем главную иконку TargetExe на SourceExe
if UpdateResource(hUpdateRes, RT_ICON, MakeIntResource(1),
GetMAINICONLanguage(PChar(TargetExe)), // ???
lpResLock, SizeofResource(hExe, hRes)) = False then Exit;
// Сохраняем сделанные изменения
Result := EndUpdateResource(hUpdateRes, False);
finally
// В любом случае закрываем открытый SourceExe
FreeLibrary(hExe);
end;
end;
////////////////////////////////////////////////////////////////////////////////


end.

Последний раз редактировалось Stilet; 04.06.2011 в 22:21.
cargo29 вне форума Ответить с цитированием
Старый 04.06.2011, 22:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
именно надо программно.. без всяких модулей
А то что модуль это и есть программа тебя не смущает?
Не нравится в модуле - просто возьми описание и реализацию процедур и помести их в свое приложение (которое тоже к твоему сведению является модулем).
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.06.2011, 23:23   #3
cargo29
Форумчанин
 
Регистрация: 13.12.2010
Сообщений: 603
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А то что модуль это и есть программа тебя не смущает?
Не нравится в модуле - просто возьми описание и реализацию процедур и помести их в свое приложение (которое тоже к твоему сведению является модулем).
где бы взять это еще?*?? мне надо что бы я брал обычный фалй icon.ico и меняю иконку у любого ЕХЕ а тут обмен состоит между ЕХЕ , а остальное не смущает.... в этих модулях идут обычные функции делфи вот и хочу узнать их как с помощью них менять иконки.

Вот эти функции испльзуются в этом модуле который я выложил...

http://www.vsokovikov.narod.ru/New_M...e/func_res.htm

но я не могу понять как переделать это все что бы брать не из Ехе файла иконку.

Поможете или нет???

Последний раз редактировалось Stilet; 05.06.2011 в 10:52.
cargo29 вне форума Ответить с цитированием
Старый 05.06.2011, 10:09   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
function ChangeMAINICON(I:TIcon, TargetExe: String): Boolean;
var
hUpdateRes: THandle;
S:TMemoryStream;
begin
Result := False;
try
 S:=TMemoryStream.Create;
 I.SaveToStream(S);
 hUpdateRes := BeginUpdateResource(PChar(TargetExe), False);
 if hUpdateRes = 0 then Exit;
 if UpdateResource(hUpdateRes, RT_ICON, MakeIntResource(1),GetMAINICONLanguage(PChar(TargetExe)),S.Memory, S.Size) = False then Exit;
 Result := EndUpdateResource(hUpdateRes, False);
finally
 S.Free;
end;
end;
ну примерно так, в чем проблема то была?
там же комментарии были довольно подробные.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.06.2011, 10:45   #5
cargo29
Форумчанин
 
Регистрация: 13.12.2010
Сообщений: 603
По умолчанию

Ага понял я не работал толком с ресурсами еще.... уже 3 форума обошел по этому вопросу.. не думал что можно использовать TMemoryStream а вот еще вопрос там функция в юните GetMAINICONLanguage она как то интересно там написана

Код:
function GetMAINICONLanguage(const sFileName: String): LANGID;
// Функция обратного вызова. Вызывается для каждого языкового
// идентификатора данного ресурса. В lParam ей передаю указатель на переменную,
// в которую возвратится результат.
function EnumResLangProc(hModule: THandle; lpszType: PChar;
2 раза сразу задается функция
cargo29 вне форума Ответить с цитированием
Старый 05.06.2011, 10:56   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
2 раза сразу задается функция
Неа. Ниразу не угадал. И не задается а описывается. Обрати внимание - первое ее упоминание идет в разделе interface а второе уже в implementation.
Так что бери книгу по элементарному паскалю и читай о том как описываются процедуры и функции в модулях
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.06.2011, 11:00   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ток по Object Pascal/Delphi
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.06.2011, 12:13   #8
cargo29
Форумчанин
 
Регистрация: 13.12.2010
Сообщений: 603
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Неа. Ниразу не угадал. И не задается а описывается. Обрати внимание - первое ее упоминание идет в разделе interface а второе уже в implementation.
Так что бери книгу по элементарному паскалю и читай о том как описываются процедуры и функции в модулях
Это я понял, уже пробовал писать юниты, но посмотри внимательнее функция определения языка упоминается только один раз

Код:
unit MainIcon;

interface

uses Windows;
function ChangeMAINICON(SourceExe, TargetExe: String): Boolean;
implementation
////////////////////////////////////////////////////////////////////////////////
// Аналог макроса MAKELANGID в С++ //
// Возвращает языковой идетификатор //
////////////////////////////////////////////////////////////////////////////////
function MAKELANGID(p :DWORD ;s : DWORD) : LANGID;
begin
Result := (s shl 10) or (p);
end;
////////////////////////////////////////////////////////////////////////////////
// Функция GetMAINICONLanguage получает имя exe-файла и возвращает //
// языковой идетификатор его главной иконки //
////////////////////////////////////////////////////////////////////////////////
function GetMAINICONLanguage(const sFileName: String): LANGID;
// Функция обратного вызова. Вызывается для каждого языкового
// идентификатора данного ресурса. В lParam ей передаю указатель на переменную,
// в которую возвратится результат.
function EnumResLangProc(hModule: THandle; lpszType: PChar;
lpszName: PChar; wIDLanguage: WORD;
lParam: Pointer): BOOL; stdcall;
begin
PWORD(lParam)^ := wIDLanguage;
Result := False; // После первого вызова сразу прекращаем перебор,
// т.к. не видел ни одной проги с разными иконками под разные языки
end;
в интерфейсе нету определения языка эта функция уже идет внутри.

и вот еще вот давали тут код

Код:
function ChangeMAINICON(I:TIcon, TargetExe: String): Boolean;
var
hUpdateRes: THandle;
S:TMemoryStream;
begin
Result := False;
try
 S:=TMemoryStream.Create;
 I.SaveToStream(S);
 hUpdateRes := BeginUpdateResource(PChar(TargetExe), False);
 if hUpdateRes = 0 then Exit;
 if UpdateResource(hUpdateRes, RT_ICON, MakeIntResource(1),GetMAINICONLanguage(PChar(TargetExe)),S.Memory, S.Size) = False then Exit;
 Result := EndUpdateResource(hUpdateRes, False);
finally
 S.Free;
end;
end;
выскакривает ошибка
PHP код:
[ErrorUnit1.pas(59): ';'')' or '=' expected but ',' found
[Fatal ErrorProject1.dpr(6): Could not compile used unit 'Unit1.pas' 
я ее не вижу.... уже 20 раз пробовал переписать все знаки все буквы... может вы увидите?
cargo29 вне форума Ответить с цитированием
Старый 05.06.2011, 13:58   #9
cargo29
Форумчанин
 
Регистрация: 13.12.2010
Сообщений: 603
По умолчанию

Stilet Пепел Феникса Вы тут??? ))))
cargo29 вне форума Ответить с цитированием
Старый 05.06.2011, 14:11   #10
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Плохо

cargo29, я поражуюсь твоему стремлению изучить тот язык, о котором ты даже книгу ни разу н прочёл.
Элементарного не знаешь!
Код:
function ChangeMAINICON(I:TIcon, TargetExe: String): Boolean;
что поставить, подумай сам.

p.s. чисто из принципа не буду давать модуль для смены иконки exe из файла.
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как программно сменить иконку в трее компонента TtrayIcon ? zmxncb Компоненты Delphi 3 15.12.2014 03:26
Сменить иконку? zhook Общие вопросы Delphi 3 28.12.2010 00:57
Как изменить описание ЕХЕ-файла и убрать дельфийскую иконку. TwiX Общие вопросы Delphi 7 03.03.2010 14:36
Как сменить каталог для сохранения файла? КаМММ Microsoft Office Excel 4 19.01.2010 08:01
как поменять иконку своего ехе файла Skalik Общие вопросы .NET 4 22.12.2007 17:51