Страница: 1 | 2 |
Вопрос: Как поменять иконку у любого exe-файла?
Добавлено: 30.03.08 21:20
Автор вопроса: Alex
Ответы
Всего ответов: 20
Номер ответа: 16
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #16
Добавлено: 15.04.08 20:24
Это я погорячилась по ходу... с иконками такая фишка не проходит как например с RT_BITMAP. Дело в том, что иконки исполняемого файла хранятся не в RT_ICON а в RT_GROUP_ICON и тут уже все гораздо серьезнее.. При обычной замене иконка портится ((( Полазив немного по инету, наткнулась на статью по работе с ресурсами на с++. Особо не вдавалась в подробности на на первый взгляд вроде ничего выдающегося..
http://netcode.ru/cpp/?lang=&katID=6&skatID=68&artID=2765
Там все доходчиво расписано, так что тебе останется перевести нужный кусок на VB
Я остановилась на этом (добавляет ресурсы запросто, меняет тоже.. только не иконки)
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace Win32ResExample
{
class Program
{
static void Main(string[] args)
{
const int RES_ICON_GROUP = 14;
const int APP_ICON_RES_ID = 32512;
string m_appPath = AppDomain.CurrentDomain.BaseDirectory;
string m_exeFilePath = m_appPath + "PEResTest.exe";
string m_icoFilePath = m_appPath + "App.ico";
IntPtr hUpdate = Win32.BeginUpdateResource(m_exeFilePath, false);
if (hUpdate != IntPtr.Zero)
{
byte[] bytes = File.ReadAllBytes(m_icoFilePath);
bool bSuccess = Win32.UpdateResource(hUpdate,
 UInt32)RES_ICON_GROUP,
 UInt32)APP_ICON_RES_ID,
0,
bytes,
 UInt32)bytes.Length);
if (bSuccess)
Console.Write("Ресурс \"{0}\" успешно записан\n", m_icoFilePath);
else
Console.Write("Ошибка при записи ресурса \"{0}\"\n", m_icoFilePath);
Win32.EndUpdateResource(hUpdate, !bSuccess);
}
Console.ReadLine();
}
}
}
public class Win32
{
[llImport("KERNEL32.DLL", EntryPoint = "BeginUpdateResourceW", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern IntPtr BeginUpdateResource(string pFileName, bool bDeleteExistingResources);
[llImport("KERNEL32.DLL", EntryPoint = "UpdateResourceW", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern bool UpdateResource(IntPtr hUpdate, UInt32 pType, UInt32 pName,
UInt16 wLanguage, byte[] pData, UInt32 cbData);
[llImport("KERNEL32.DLL", EntryPoint = "EndUpdateResourceW", SetLastError = true,
CharSet = CharSet.Unicode, ExactSpelling = true,
CallingConvention = CallingConvention.StdCall)]
public static extern bool EndUpdateResource(IntPtr hUpdate, bool bDiscard);
}
Номер ответа: 17
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #17
Добавлено: 15.04.08 20:56
ВОт, кстати, тоже в тему чтоб понятно было что там да куда..
Номер ответа: 18
Автор ответа:
ника
Вопросов: 1
Ответов: 111
Профиль | | #18
Добавлено: 15.04.08 20:56
http://www.realcoding.net/article/view/4410
Номер ответа: 19
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #19
Добавлено: 16.04.08 10:16
AgentFire, ты поспрашивай тут у людей, тебе скажут, что я пишу компилятор бейсика и знаю о формате PE32, возможно, лучше любого на этом форуме (да простят меня местные, если я не прав). Так что я знаю как устроена секция ресурсов и директория ресусов. И иконки там конвертированы в свой формат. Как вариант, можно использовать тулзу rc.exe (компилятор ресурсов), создавать объектник и из него уже читать иконку. Но это геморрой А искать готовые варианты кода конвертора мне не хотелось.
Номер ответа: 20
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #20
Добавлено: 18.04.08 02:38
Весь инет облазил, а на этом сайте из принципа не смотрел? Здесь есть готовый пример на VB6, переделать его под .NET - пара минут делов, нужно только декларацию апи функций немного подправить.