Можно выбрать одну из пяти тем для приложения (aqua, blue, black, silver, windows7).
При статической компиляции внутрь экзешника попадают ресурсы всех тем.
Если в приложении есть переключение тем, это гуд.
А если Ваше приложение всегда должно быть одного цвета -- как то жалко тратить больше 700 KB на ресурсы, которые никогда не используются.
А если учесть то, что это PNG и они плохо жмутся пакерами...
Вот, набросал за часик на коленке питонячий скрипт, который это лечит.
import sys from ctypes import * w32 = windll.kernel32 def get_res_list(fname): handle = w32.LoadLibraryW(fname) if not handle: return None types = [] def types_callback(handle, t): try: types.append(cast(t, c_wchar_p).value) except: pass return True types_callback_t = CFUNCTYPE(c_void_p, c_wchar_p, c_long) fun = types_callback_t(types_callback) w32.EnumResourceTypesW(handle, fun, 0) result = [] def names_callback(h, t, n): try: t = cast(t, c_wchar_p).value n = cast(n, c_wchar_p).value result.append((t,n)) except e: print e return True names_callback_t = CFUNCTYPE(c_void_p, c_wchar_p, c_wchar_p, c_long) fun = names_callback_t(names_callback) for t in types: w32.EnumResourceNamesW(handle, c_wchar_p(t), fun, 0) w32.FreeLibrary(handle) return result NOT_USED = ('AQUA', 'SILVER', 'WINDOWS7', 'BLACK') is_not_used = lambda x: x[1].split('_')[0] in NOT_USED def remove_resources(fname, not_used): handle = w32.BeginUpdateResourceW(fname, False) if not handle: return False ok = True try: for t,n in not_used: w32.UpdateResourceW(handle, t, n, 0x409, None, 0) except e: print e ok = False w32.EndUpdateResourceW(handle, not ok) return ok fname = u'd:\\app.exe' not_used = filter(is_not_used, get_res_list(fname)) print remove_resources(fname, not_used)
Комментариев нет:
Отправить комментарий