PDA

Просмотр полной версии : Изменение иконки exe файла.


ShkiperLol
17.06.2010, 00:24
Нужно програмно изменить иконку exe файла,на иконку которая находиться в ресурсах приложения которое будет изменять.
Написал такой код,но почемуто стандартная икона не меняеться на нужную мне.
В чем может быть проблема?

int main(int argc, char* argv[])
{
HRSRC find=FindResourceA(0,"ICO","RT_ICON");
if(find)
{
HGLOBAL glob=LoadResource(0,find);
if(glob)
{
LPVOID lock=LockResource(glob);
if(lock)
{
HANDLE update=BeginUpdateResource("ip.exe",false);
if(update)
{
BOOL up=UpdateResource(update,"Иконка","MAINICON",NULL,lock,SizeofResource(0,find));
EndUpdateResourceA(update,false);
}
}
}
}
return 0;
}

POS_troi
17.06.2010, 00:39
Чтобы изменить ресурсы, нужно открыть файл на запись а он у тебя запущен.

ShkiperLol
17.06.2010, 00:41
Но он то в ресурсы пишеться,просто пишеться не так как нада.В ресурсах файла есть "Иконка",так вот заместь того чтобы переписать ее ,создаеться еще одна "Иконка"

Gar|k
17.06.2010, 00:49
а ты тут не пробовал читать?

http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx#_win32_Updating_Resources

ShkiperLol
17.06.2010, 00:52
Те же самые функции я использую в совем коде.

Gar|k
17.06.2010, 00:59
*WALL* молодец... только не в том порядке... ты даже на загружаешь файл куда хочешь внести изменения...

хотя вроде правильно... единственное чтобы изменить ресурс ты должен знать точный его индификтор (номер) в файле ip.exe

ShkiperLol
17.06.2010, 01:59
единственное чтобы изменить ресурс ты должен знать точный его индификтор (номер) в файле ip.exe
А какой функцией его можна узнать?

Ra$cal
17.06.2010, 02:28
редактором ресурсов руками

Gar|k
17.06.2010, 02:46
учись читать MSDN
http://msdn.microsoft.com/en-us/library/ms648005(v=VS.85).aspx - перечисление ресурсов
я думаю тебе пойдет вот эта функция EnumResourceNames c типом RC_ICON

1 делаешь

HMODULE hExe = LoadLibrary(TEXT("ip.exe"));
if (hExe == NULL) return -1;

2 EnumResourceNames почитай тут кароче
http://msdn.microsoft.com/en-us/library/ms648008(v=VS.85).aspx#_win32_Creating_a_Resource_ List
там все примеры

в общем получив имя ресурса или его id в случае если IS_INTRESOURCE
ты уже можешь вызвать UpdateResource

// Open the file to which you want to add the dialog box resource.
hUpdateRes = BeginUpdateResource(TEXT("foot.exe"), FALSE);
if (hUpdateRes == NULL)
{
ErrorHandler(TEXT("Could not open file for writing."));
return;
}

// Add the dialog box resource to the update list.
result = UpdateResource(hUpdateRes, // update resource handle
RT_DIALOG, // change dialog box resource
MAKEINTRESOURCE(IDD_FOOT_ABOUTBOX), // dialog box id
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), // neutral language
lpResLock, // ptr to resource info
SizeofResource(hExe, hRes)); // size of resource info

где MAKEINTRESOURCE(IDD_FOOT_ABOUTBOX) это как раз имя найденого ресурса lpName которое в функции EnumNamesFunc

------------
кароче мне лень запускать VS )))

slesh
17.06.2010, 12:44
Вообще ты не имеешь право менять ресурсы у себяже потому что это вызовет сбой. Зато ты можеш сделать копию своейже проги и у неё менять ресурс.

А вообще чтобы забрать ресурс из чужой проги/dll нельзя юзать LoadLibrary (т.е. можно но это неправильно и хавает больше ресурсов) Для таких целей юзается LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE. Потому как гласит MS

LOAD_LIBRARY_AS_DATAFILE
0x00000002 If this value is used, the system maps the file into the calling process's virtual address space as if it were a data file. Nothing is done to execute or prepare to execute the mapped file. Therefore, you cannot call functions like GetModuleHandle or GetProcAddress with this DLL. Also, this value causes writes to read-only memory to raise an access violation. Use this flag when you want to load a DLL only to extract messages or resources from it.
Windows Me/98/95: You can use the resulting module handle only with resource management functions such as EnumResourceLanguages, EnumResourceNames, EnumResourceTypes, FindResource, FindResourceEx, LoadResource, and SizeofResource. You cannot use this handle with specialized resource management functions such as LoadBitmap, LoadCursor, LoadIcon, LoadImage, and LoadMenu.

ShkiperLol
17.06.2010, 21:16
Вы вобще читали мой первый пост?
Я не пытаюсь менять ресурсы у себя,я хочю изменить ресурс(иконку)у другого приложения!