66 DWORD dwBytesInRes; 67 WORD nID; 68 } GRPICONDIRENTRY, * LPGRPICONDIRENTRY; 69 #pragma pack(pop) 70 71 #pragma pack(push) 72 #pragma pack(2) 73 74 typedef struct _GRPICONDIR { 75 WORD idReserved; 76 WORD idType; 77 WORD idCount; 78 GRPICONDIRENTRY idEntries[1]; 79 } GRPICONDIR, * LPGRPICONDIR; 80 #pragma pack(pop) 81 82 void PrintError() { 83 LPVOID message = NULL; 84 DWORD error = GetLastError(); 85 86 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 87 FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 88 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 89 (LPTSTR) & message, 0, NULL) != 0) { 90 printf("%S", (LPTSTR) message); 91 LocalFree(message); 92 } 93 } 94 95 // Note: We do not check here that iconTarget is valid icon. 96 // Java code will already do this for us. 97 98 bool ChangeIcon(wstring iconTarget, wstring launcher) { 99 WORD language = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT); 100 101 HANDLE icon = CreateFile(iconTarget.c_str(), GENERIC_READ, 0, NULL, 102 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 103 if (icon == INVALID_HANDLE_VALUE) { 104 PrintError(); 105 return false; 106 } 107 167 SetFilePointer(icon, lpid->idEntries[i].dwImageOffset, 168 NULL, FILE_BEGIN); 169 ReadFile(icon, lpBuffer, lpid->idEntries[i].dwBytesInRes, 170 &dwBytesRead, NULL); 171 if (!UpdateResource(update, RT_ICON, 172 MAKEINTRESOURCE(lpgid->idEntries[i].nID), 173 language, &lpBuffer[0], lpid->idEntries[i].dwBytesInRes)) { 174 free(lpBuffer); 175 free(lpid); 176 free(lpgid); 177 CloseHandle(icon); 178 PrintError(); 179 return false; 180 } 181 free(lpBuffer); 182 } 183 184 free(lpid); 185 CloseHandle(icon); 186 187 if (!UpdateResource(update, RT_GROUP_ICON, 188 MAKEINTRESOURCE(1), language, &lpgid[0], 189 (sizeof (WORD) * 3) + (sizeof (GRPICONDIRENTRY) * lpgid->idCount))) { 190 free(lpgid); 191 PrintError(); 192 return false; 193 } 194 195 free(lpgid); 196 197 if (EndUpdateResource(update, FALSE) == FALSE) { 198 PrintError(); 199 return false; 200 } 201 202 return true; 203 } | 66 DWORD dwBytesInRes; 67 WORD nID; 68 } GRPICONDIRENTRY, * LPGRPICONDIRENTRY; 69 #pragma pack(pop) 70 71 #pragma pack(push) 72 #pragma pack(2) 73 74 typedef struct _GRPICONDIR { 75 WORD idReserved; 76 WORD idType; 77 WORD idCount; 78 GRPICONDIRENTRY idEntries[1]; 79 } GRPICONDIR, * LPGRPICONDIR; 80 #pragma pack(pop) 81 82 void PrintError() { 83 LPVOID message = NULL; 84 DWORD error = GetLastError(); 85 86 if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER 87 | FORMAT_MESSAGE_FROM_SYSTEM 88 | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, 89 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 90 (LPTSTR) & message, 0, NULL) != 0) { 91 printf("%S", (LPTSTR) message); 92 LocalFree(message); 93 } 94 } 95 96 // Note: We do not check here that iconTarget is valid icon. 97 // Java code will already do this for us. 98 99 bool ChangeIcon(wstring iconTarget, wstring launcher) { 100 WORD language = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT); 101 102 HANDLE icon = CreateFile(iconTarget.c_str(), GENERIC_READ, 0, NULL, 103 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 104 if (icon == INVALID_HANDLE_VALUE) { 105 PrintError(); 106 return false; 107 } 108 168 SetFilePointer(icon, lpid->idEntries[i].dwImageOffset, 169 NULL, FILE_BEGIN); 170 ReadFile(icon, lpBuffer, lpid->idEntries[i].dwBytesInRes, 171 &dwBytesRead, NULL); 172 if (!UpdateResource(update, RT_ICON, 173 MAKEINTRESOURCE(lpgid->idEntries[i].nID), 174 language, &lpBuffer[0], lpid->idEntries[i].dwBytesInRes)) { 175 free(lpBuffer); 176 free(lpid); 177 free(lpgid); 178 CloseHandle(icon); 179 PrintError(); 180 return false; 181 } 182 free(lpBuffer); 183 } 184 185 free(lpid); 186 CloseHandle(icon); 187 188 if (!UpdateResource(update, RT_GROUP_ICON, MAKEINTRESOURCE(1), 189 language, &lpgid[0], (sizeof (WORD) * 3) 190 + (sizeof (GRPICONDIRENTRY) * lpgid->idCount))) { 191 free(lpgid); 192 PrintError(); 193 return false; 194 } 195 196 free(lpgid); 197 198 if (EndUpdateResource(update, FALSE) == FALSE) { 199 PrintError(); 200 return false; 201 } 202 203 return true; 204 } |