Ternick
@Ternick

Как изменить иконку исполняемого файла?

Как изменить иконку исполняемого файла?
Нашёл только этот вариант, который не работает.
spoiler
#include <Windows.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#pragma pack(push, 2)
typedef struct {
	WORD _id_reserved;
	WORD _id_type;
	WORD _id_count;
	BYTE _width;
	BYTE _height;
	BYTE _color_count;
	BYTE _reserved;
	WORD _planes;
	WORD _bit_count;
	DWORD _bytes_in_resource;
	DWORD _image_offset;
} ICON_ENTRY;
#pragma pack(pop)


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	wstring ico = L"ic.ico";
	wstring exe = L"app.exe";
	HANDLE resource_handle = BeginUpdateResource(exe.data(), FALSE);
	wchar_t* buffer;
	size_t buffer_size;
	wifstream icon(ico.data(), ios::in | ios::binary);
	
	if (icon.good()) {
		icon.seekg(0, icon.end);
		buffer_size = (size_t)icon.tellg();
		buffer = new wchar_t[buffer_size];
		icon.read(buffer, buffer_size);
		icon.close();

		UpdateResource(resource_handle, RT_ICON, MAKEINTRESOURCE(1), MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), buffer + 22, buffer_size - 22);

		ICON_ENTRY icon_entry;

		icon_entry._id_reserved = 0;
		icon_entry._id_type = 1;
		icon_entry._id_count = 1;
		icon_entry._width = 32;
		icon_entry._height = 32;
		icon_entry._color_count = 0;
		icon_entry._reserved = 0;
		icon_entry._planes = 2;
		icon_entry._bit_count = 32;
		icon_entry._bytes_in_resource = buffer_size - 22;
		icon_entry._image_offset = 2;

		UpdateResource(resource_handle, RT_GROUP_ICON, L"MAINICON", MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT), &icon_entry, sizeof(ICON_ENTRY));

		EndUpdateResource(resource_handle, FALSE);
		delete buffer;
	}
	return 0;
}


Он записывает некоторые данные в .exe файл, но иконка которая записана в .exe файле не читается и поэтому он просто портит существующую иконку.

Что может быть не так ?
  • Вопрос задан
  • 359 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы