Изменение иконки у *.exe

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
WERT-007
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.07.2005 (Ср) 15:10

Изменение иконки у *.exe

Сообщение WERT-007 » 26.08.2005 (Пт) 16:08

Возможно ли изменить иконку у программы?

skord
Китаец
Китаец
 
Сообщения: 572
Зарегистрирован: 14.10.2004 (Чт) 15:36
Откуда: Иркутск

Сообщение skord » 26.08.2005 (Пт) 16:10

:shock:

Свойсво формы Icon?

WERT-007
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.07.2005 (Ср) 15:10

Сообщение WERT-007 » 26.08.2005 (Пт) 16:15

Да нет, не у моей программы, а у чужой, скомпилированной программы.

extHack
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 04.06.2005 (Сб) 12:31
Откуда: 127.0.0.1

Сообщение extHack » 26.08.2005 (Пт) 16:18

Ну вообщето это не просто. Узнай смещение в exe, и все такое.
n/a

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 26.08.2005 (Пт) 16:19

resource hacker :!:

extHack
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 04.06.2005 (Сб) 12:31
Откуда: 127.0.0.1

Сообщение extHack » 26.08.2005 (Пт) 16:19

У меня был такой же вопрос, я заменял значок 32x32 (16 colors) все высчитал. И облом. Значек заменился только в заголовке. Там сложновато
n/a

extHack
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 04.06.2005 (Сб) 12:31
Откуда: 127.0.0.1

Сообщение extHack » 26.08.2005 (Пт) 16:25

Konst_One писал(а):resource hacker :!:


Можно юзать и Restorator :D
n/a

WERT-007
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.07.2005 (Ср) 15:10

Сообщение WERT-007 » 26.08.2005 (Пт) 16:25

Узнай смещение в exe, и все такое.
А где оно хранится?

И еще - вообще-то мне нужно сделать одной программе, например, значек от другой. Может так проще? В смысле заменять целым куском, а не создаватьь свой?

extHack
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 04.06.2005 (Сб) 12:31
Откуда: 127.0.0.1

Сообщение extHack » 26.08.2005 (Пт) 16:30

WERT-007 писал(а):
Узнай смещение в exe, и все такое.
А где оно хранится?

И еще - вообще-то мне нужно сделать одной программе, например, значек от другой. Может так проще? В смысле заменять целым куском, а не создаватьь свой?


По сигнатуре файла *.ico
n/a

WERT-007
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 27.07.2005 (Ср) 15:10

Сообщение WERT-007 » 26.08.2005 (Пт) 16:35

По сигнатуре файла *.ico
Понял.
И еще, а где-нибудь можно найти алгоритм работы того же ResHacker'a (ведь он же должен весь exe'шник переделывать...смещения там и т.д.)

skord
Китаец
Китаец
 
Сообщения: 572
Зарегистрирован: 14.10.2004 (Чт) 15:36
Откуда: Иркутск

Сообщение skord » 26.08.2005 (Пт) 16:35

Ааа!..
Ну вроде были исходники редактора ресурсов на vb, если не ошибаюсь... так что поиск может помочь :)

Крост
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 291
Зарегистрирован: 30.01.2005 (Вс) 6:06
Откуда: Питер

Сообщение Крост » 26.08.2005 (Пт) 18:11

Во-во..мне вдруг стало интерестно, как при помощи VB изменить иконку...

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 26.08.2005 (Пт) 19:03

Вообще-то никакого смещения вычислять не надо... Есть функции BeginUpdateResource, UpdateResource и EndUpdateResource. Их и используйте.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.08.2005 (Пт) 19:26

WERT-007 писал(а):
По сигнатуре файла *.ico
Понял.
И еще, а где-нибудь можно найти алгоритм работы того же ResHacker'a (ведь он же должен весь exe'шник переделывать...смещения там и т.д.)

1. У файла .ico нет сигнатуры :lol:
2. Алгоритм выковыривания иконок детально описан в ftp://cs.usu.edu.ru/util/IcoCur/prjIcoCur.txt , и исходники выковыривалки на VB лежат рядом. Запихивать точно так же :-)
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 26.08.2005 (Пт) 22:35

tyomitch, имеется в виду подпись в хедере формата Windows Bitmap-File о том, что это иконка, а не картинка.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.08.2005 (Пт) 23:17

Ты имеешь в виду (WORD)1? Хорошая сигнатура, найти по ней иконку в ехе-шнике будет совсем легко :-D

Не говоря уже о том, что и этой "сигнатуры" в иконке в ехе-шнике нет.
Изображение

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 26.08.2005 (Пт) 23:46

Какую еще сигнатуру можно иметь в виду? :D

Битмапы в ресурсах не различаются "сигнатурами"? Просто данные DIB-формата?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 27.08.2005 (Сб) 16:31

Битмапы в ресурсах различаются типом ресурса, у иконок это RT_ICON=(DWORD)3. Опять же, по этой "сигнатуре" иконку не найти просто так, всё равно придётся разбирать таблицу ресурсов или юзать API.
Изображение

Крост
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 291
Зарегистрирован: 30.01.2005 (Вс) 6:06
Откуда: Питер

Сообщение Крост » 27.08.2005 (Сб) 20:34

ANDLL
На счёт функций можно по-подробнее, а то в АпиГид нету их..=(

RUSYA
Обычный пользователь
Обычный пользователь
 
Сообщения: 84
Зарегистрирован: 22.07.2005 (Пт) 20:17
Откуда: Харьков

Сообщение RUSYA » 28.08.2005 (Вс) 16:44

Private Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Private Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
Private Declare Function FindResourceEx Lib "kernel32" Alias "FindResourceExA" (ByVal hModule As Long, ByVal lpType As String, ByVal lpName As String, ByVal wLanguage As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function LockResource Lib "kernel32" (ByVal hResData As Long) As Long
Private Declare Function SizeofResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function LoadResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

Const FileName = "c:\2.exe"

Private Sub Command1_Click() 'Записать
Dim h As Long
Dim txt As String
h = BeginUpdateResource(FileName, 0)
txt = "Текстфывфыв2222222222фывфывфффф"
Call UpdateResource(h, "TEXT", "2", 1049, ByVal txt, Len(txt)) '1049 - язык
Call EndUpdateResource(h, 0)
End Sub

Private Sub Command2_Click() 'Прочитать
Dim txt As String
Dim hgRes As Long

hLib = LoadLibrary(FileName)
hRes = FindResourceEx(hLib, ByVal "TEXT", ByVal "2", 1049)
hLRes = LoadResource(hLib, hRes)
hgRes = LockResource(hLRes)
lenRes = SizeofResource(hLib, hRes)

txt = Space(lenRes)
CopyMemory ByVal txt, ByVal hgRes, lenRes

FreeLibrary hLib

MsgBox txt
End Sub
А как оно на самом деле - Х.З. !

RUSYA
Обычный пользователь
Обычный пользователь
 
Сообщения: 84
Зарегистрирован: 22.07.2005 (Пт) 20:17
Откуда: Харьков

Сообщение RUSYA » 28.08.2005 (Вс) 16:46

З.Ы. Это текст, для иконки есстно подправить надо
А как оно на самом деле - Х.З. !

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.08.2005 (Вс) 17:13

RUSYA
Этот код работает только в Win2000 и выше.

А вот http://bbs.vbstreets.ru/viewtopic.php?p=146184#146184 работает везде.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 29.08.2005 (Пн) 1:41

Насчет сигнатуры, там и иконка записываенся ни как ICO иконка. В ресурсе груп иконок указывается смещение на иконку в другй ветке, ресурсов иконок. А эта иконка не иконка какойие-то массивы бит AND, XOR и прочая ерунда. Без 100 грам не разобрать, а я не пьщий.
Давным-давно хотел сделать бесплатный аналог Ресторатора, но видимо не судьба. Может это вам поможет.

PS
Я уже давно эту идею забросил.
Вложения
Res.rar
(110.51 Кб) Скачиваний: 111

DmB
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 02.11.2003 (Вс) 9:15

Сообщение DmB » 30.08.2005 (Вт) 7:53

Хороший пример работы с resource hacker, кстати можно сменить иконку на 32Bit!

http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=59231&lngWId=1

vitas123
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 02.09.2005 (Пт) 16:59

Сообщение vitas123 » 02.09.2005 (Пт) 17:02

Код: Выделить всё
Private Declare Function BeginUpdateResource& Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal _
bDeleteExistingResources As Long)
Private Declare Function FindResource& Lib "kernel32" Alias "FindResourceA" (ByVal _
      hInstance As Long, ByVal lpName As String, ByVal lpType As String)
Private Declare Function FindResourceEx& Lib "kernel32" Alias "FindResourceExA" (ByVal _
      hModule As Long, ByVal lpType As String, ByVal lpName As String, ByVal _
      wLanguage As Integer)
Private Declare Function LoadResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Function UpdateResource& Lib "kernel32" Alias "UpdateResourceA" (ByVal _
      hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal _
      wLanguage As Long, lpData As Any, ByVal cbData As Long)
Private Declare Function EndUpdateResource& Lib "kernel32" Alias "EndUpdateResourceA" _
      (ByVal hUpdate As Long, ByVal fDiscard As Long)

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function FindResourceByNum Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, ByVal lpName As String, ByVal lpType As Long) As Long
Private Declare Function SizeofResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Function LockResource Lib "kernel32" (ByVal hResData As Long) As Long

Const RT_ICON = 3&

Private Sub Form_Load()
    hModule = LoadLibrary("c:\2.exe")
    hRsrc = FindResourceByNum(hModule, "#1", CLng(14))
    hGlobal = LoadResource(hModule, hRsrc)
    pResLock = LockResource(hGlobal)
    ResSize = SizeofResource(hModule, hRsrc)
    hResUpdate = BeginUpdateResource("c:\3.exe", False)
    Call UpdateResource(hResUpdate, RT_ICON, ByVal "1", 0, pResLock, ResSize)
    EndUpdateResource hResUpdate, False
End Sub


Всё работает, ресурс добавляется, почему - то в итоге тип ресурса - "3", а содержание не иконка, а шестанадцатеричный код.
Может кто-то догадается?

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 02.09.2005 (Пт) 17:31

Private Declare Function UpdateResource& Lib "kernel32" Alias "UpdateResourceA" (ByVal _
hUpdate As Long, ByVal lpType As String, ByVal lpName As String, ByVal _
wLanguage As Long, lpData As Any, ByVal cbData As Long)


и
Const RT_ICON = 3&, т.е. Const RT_ICON as Long = &H3

Это как? Я всегда обявляю как ANY и не парюсь

vitas123
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 02.09.2005 (Пт) 16:59

Сообщение vitas123 » 02.09.2005 (Пт) 22:03

Такая же канитель. Все равно не меняет иконку.
Может у кого код есть. Хэлп...

vitas123
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 02.09.2005 (Пт) 16:59

Сообщение vitas123 » 04.09.2005 (Вс) 9:29

Ну и что такая тишина?

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 04.09.2005 (Вс) 10:40

Call UpdateResource(hResUpdate, RT_ICON, ByVal "1", 0, pResLock, ResSize)

Неправда, 1 - не строка в данном случае. Используй Ресторатор для посмотра промежуточных результатов. А лутше ResHacker или недаделанную прогу, которую я выложил.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 88

    TopList  
cron