< prev index next >
src/jdk.jpackage/windows/native/jpackage/IconSwap.cpp
Print this page
*** 21,50 ****
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
- // iconswap.cpp : Defines the entry point for the console application.
- //
-
- //Define Windows compatibility requirements
- //XP or later
- #define WINVER 0x0501
- #define _WIN32_WINNT 0x0501
-
- #include <tchar.h>
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
! #include <iostream>
#include <malloc.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <io.h>
- #include <strsafe.h>
- #include <Shellapi.h>
// http://msdn.microsoft.com/en-us/library/ms997538.aspx
typedef struct _ICONDIRENTRY {
BYTE bWidth;
--- 21,37 ----
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
! #include <string>
#include <malloc.h>
+ using namespace std;
// http://msdn.microsoft.com/en-us/library/ms997538.aspx
typedef struct _ICONDIRENTRY {
BYTE bWidth;
*** 66,75 ****
--- 53,63 ----
// #pragmas are used here to insure that the structure's
// packing in memory matches the packing of the EXE or DLL.
#pragma pack(push)
#pragma pack(2)
+
typedef struct _GRPICONDIRENTRY {
BYTE bWidth;
BYTE bHeight;
BYTE bColorCount;
BYTE bReserved;
*** 80,170 ****
} GRPICONDIRENTRY, * LPGRPICONDIRENTRY;
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
typedef struct _GRPICONDIR {
WORD idReserved;
WORD idType;
WORD idCount;
GRPICONDIRENTRY idEntries[1];
} GRPICONDIR, * LPGRPICONDIR;
#pragma pack(pop)
! void PrintError()
! {
! LPVOID message;
DWORD error = GetLastError();
! FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
! (LPTSTR) &message, 0, NULL);
!
! wprintf(L"%s\n", (__wchar_t *) message); // VS2017 - FIXME
LocalFree(message);
}
! bool ChangeIcon(_TCHAR* iconFileName, _TCHAR* executableFileName)
! {
! bool result = false;
! DWORD dwData = 1;
WORD language = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
! _TCHAR* iconExtension = wcsrchr(iconFileName, '.');
! if (iconExtension == NULL || wcscmp(iconExtension, L".ico") != 0) {
! wprintf(L"Unknown icon format - please provide .ICO file.\n");
! return result;
! }
!
! HANDLE icon = CreateFile(iconFileName, GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (icon == INVALID_HANDLE_VALUE) {
PrintError();
! return result;
}
// Reading .ICO file
WORD idReserved, idType, idCount;
DWORD dwBytesRead;
! ReadFile(icon, &idReserved, sizeof(WORD), &dwBytesRead, NULL);
! ReadFile(icon, &idType, sizeof(WORD), &dwBytesRead, NULL);
! ReadFile(icon, &idCount, sizeof(WORD), &dwBytesRead, NULL);
!
! LPICONDIR lpid = (LPICONDIR)malloc(
! sizeof(ICONDIR) + (sizeof(ICONDIRENTRY) * (idCount - 1)));
if (lpid == NULL) {
CloseHandle(icon);
! wprintf(L"Unknown error.\n");
}
lpid->idReserved = idReserved;
lpid->idType = idType;
lpid->idCount = idCount;
! ReadFile(icon, &lpid->idEntries[0], sizeof(ICONDIRENTRY) * lpid->idCount,
&dwBytesRead, NULL);
!
! LPGRPICONDIR lpgid = (LPGRPICONDIR)malloc(
! sizeof(GRPICONDIR) + (sizeof(GRPICONDIRENTRY) * (idCount - 1)));
!
if (lpid == NULL) {
CloseHandle(icon);
free(lpid);
! wprintf(L"Unknown error.\n");
}
lpgid->idReserved = idReserved;
lpgid->idType = idType;
lpgid->idCount = idCount;
! for(int i = 0; i < lpgid->idCount; i++)
! {
lpgid->idEntries[i].bWidth = lpid->idEntries[i].bWidth;
lpgid->idEntries[i].bHeight = lpid->idEntries[i].bHeight;
lpgid->idEntries[i].bColorCount = lpid->idEntries[i].bColorCount;
lpgid->idEntries[i].bReserved = lpid->idEntries[i].bReserved;
lpgid->idEntries[i].wPlanes = lpid->idEntries[i].wPlanes;
--- 68,149 ----
} GRPICONDIRENTRY, * LPGRPICONDIRENTRY;
#pragma pack(pop)
#pragma pack(push)
#pragma pack(2)
+
typedef struct _GRPICONDIR {
WORD idReserved;
WORD idType;
WORD idCount;
GRPICONDIRENTRY idEntries[1];
} GRPICONDIR, * LPGRPICONDIR;
#pragma pack(pop)
! void PrintError() {
! LPVOID message = NULL;
DWORD error = GetLastError();
! if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
! (LPTSTR) & message, 0, NULL) != 0) {
! printf("%S", (LPTSTR) message);
LocalFree(message);
+ }
}
! // Note: We do not check here that iconTarget is valid icon.
! // Java code will already do this for us.
! bool ChangeIcon(wstring iconTarget, wstring launcher) {
WORD language = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT);
! HANDLE icon = CreateFile(iconTarget.c_str(), GENERIC_READ, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (icon == INVALID_HANDLE_VALUE) {
PrintError();
! return false;
}
// Reading .ICO file
WORD idReserved, idType, idCount;
DWORD dwBytesRead;
! ReadFile(icon, &idReserved, sizeof (WORD), &dwBytesRead, NULL);
! ReadFile(icon, &idType, sizeof (WORD), &dwBytesRead, NULL);
! ReadFile(icon, &idCount, sizeof (WORD), &dwBytesRead, NULL);
+ LPICONDIR lpid = (LPICONDIR) malloc(
+ sizeof (ICONDIR) + (sizeof (ICONDIRENTRY) * (idCount - 1)));
if (lpid == NULL) {
CloseHandle(icon);
! printf("Error: Failed to allocate memory\n");
! return false;
}
lpid->idReserved = idReserved;
lpid->idType = idType;
lpid->idCount = idCount;
! ReadFile(icon, &lpid->idEntries[0], sizeof (ICONDIRENTRY) * lpid->idCount,
&dwBytesRead, NULL);
! LPGRPICONDIR lpgid = (LPGRPICONDIR) malloc(
! sizeof (GRPICONDIR) + (sizeof (GRPICONDIRENTRY) * (idCount - 1)));
if (lpid == NULL) {
CloseHandle(icon);
free(lpid);
! printf("Error: Failed to allocate memory\n");
! return false;
}
lpgid->idReserved = idReserved;
lpgid->idType = idType;
lpgid->idCount = idCount;
! for (int i = 0; i < lpgid->idCount; i++) {
lpgid->idEntries[i].bWidth = lpid->idEntries[i].bWidth;
lpgid->idEntries[i].bHeight = lpid->idEntries[i].bHeight;
lpgid->idEntries[i].bColorCount = lpid->idEntries[i].bColorCount;
lpgid->idEntries[i].bReserved = lpid->idEntries[i].bReserved;
lpgid->idEntries[i].wPlanes = lpid->idEntries[i].wPlanes;
*** 172,229 ****
lpgid->idEntries[i].dwBytesInRes = lpid->idEntries[i].dwBytesInRes;
lpgid->idEntries[i].nID = i + 1;
}
// Store images in .EXE
! HANDLE update = BeginUpdateResource( executableFileName, FALSE );
!
if (update == NULL) {
free(lpid);
free(lpgid);
CloseHandle(icon);
PrintError();
! return result;
}
! for(int i = 0; i < lpid->idCount; i++)
! {
! LPBYTE lpBuffer = (LPBYTE)malloc(lpid->idEntries[i].dwBytesInRes);
SetFilePointer(icon, lpid->idEntries[i].dwImageOffset,
NULL, FILE_BEGIN);
ReadFile(icon, lpBuffer, lpid->idEntries[i].dwBytesInRes,
&dwBytesRead, NULL);
if (!UpdateResource(update, RT_ICON,
MAKEINTRESOURCE(lpgid->idEntries[i].nID),
! language, &lpBuffer[0], lpid->idEntries[i].dwBytesInRes))
! {
free(lpBuffer);
free(lpid);
free(lpgid);
CloseHandle(icon);
PrintError();
! return result;
}
free(lpBuffer);
}
free(lpid);
CloseHandle(icon);
if (!UpdateResource(update, RT_GROUP_ICON,
MAKEINTRESOURCE(1), language, &lpgid[0],
! (sizeof(WORD) * 3) + (sizeof(GRPICONDIRENTRY) * lpgid->idCount)))
! {
free(lpgid);
PrintError();
! return result;
}
free(lpgid);
if (EndUpdateResource(update, FALSE) == FALSE) {
PrintError();
! return result;
}
! result = true;
! return result;
}
--- 151,203 ----
lpgid->idEntries[i].dwBytesInRes = lpid->idEntries[i].dwBytesInRes;
lpgid->idEntries[i].nID = i + 1;
}
// Store images in .EXE
! HANDLE update = BeginUpdateResource(launcher.c_str(), FALSE);
if (update == NULL) {
free(lpid);
free(lpgid);
CloseHandle(icon);
PrintError();
! return false;
}
! for (int i = 0; i < lpid->idCount; i++) {
! LPBYTE lpBuffer = (LPBYTE) malloc(lpid->idEntries[i].dwBytesInRes);
SetFilePointer(icon, lpid->idEntries[i].dwImageOffset,
NULL, FILE_BEGIN);
ReadFile(icon, lpBuffer, lpid->idEntries[i].dwBytesInRes,
&dwBytesRead, NULL);
if (!UpdateResource(update, RT_ICON,
MAKEINTRESOURCE(lpgid->idEntries[i].nID),
! language, &lpBuffer[0], lpid->idEntries[i].dwBytesInRes)) {
free(lpBuffer);
free(lpid);
free(lpgid);
CloseHandle(icon);
PrintError();
! return false;
}
free(lpBuffer);
}
free(lpid);
CloseHandle(icon);
if (!UpdateResource(update, RT_GROUP_ICON,
MAKEINTRESOURCE(1), language, &lpgid[0],
! (sizeof (WORD) * 3) + (sizeof (GRPICONDIRENTRY) * lpgid->idCount))) {
free(lpgid);
PrintError();
! return false;
}
free(lpgid);
if (EndUpdateResource(update, FALSE) == FALSE) {
PrintError();
! return false;
}
! return true;
}
< prev index next >