• R/O
  • SSH
  • HTTPS

exewrap: Commit


Commit MetaInfo

Revision44 (tree)
Time2017-11-19 21:07:10
Authorhirukawa_ryo

Log Message

* exewrap 1.2.2 Javaのインストールディレクトリを検索する処理をJava9対応にバグがあり、32ビット/64ビット両方のJREがインストールされている環境で正しくJREを検出できなくなっていた問題を修正しました。

Change Summary

Incremental Difference

--- exewrap/trunk/exewrap/src/jvm.c (revision 43)
+++ exewrap/trunk/exewrap/src/jvm.c (revision 44)
@@ -9,6 +9,7 @@
99
1010 void InitializePath(char* relative_classpath, char* relative_extdirs, BOOL useServerVM, BOOL useSideBySideJRE);
1111 int GetProcessArchitecture();
12+int GetPlatformArchitecture();
1213 JNIEnv* CreateJavaVM(LPTSTR vm_args_opt, LPTSTR systemClassLoader, BOOL useServerVM, BOOL useSideBySideJRE, int* err);
1314 void DestroyJavaVM();
1415 JNIEnv* AttachJavaVM();
@@ -52,6 +53,7 @@
5253 HMODULE jvmdll;
5354
5455 /* このプロセスのアーキテクチャ(32ビット/64ビット)を返します。
56+ * 64ビットOSで32ビットプロセスを実行している場合、この関数は32を返します。
5557 * 戻り値として32ビットなら 32 を返します。64ビットなら 64 を返します。
5658 */
5759 int GetProcessArchitecture()
@@ -59,6 +61,30 @@
5961 return sizeof(int*) * 8;
6062 }
6163
64+/* OSのアーキテクチャ(32ビット/64ビット)を返します。
65+ * 64ビットOSで32ビットプロセスを実行している場合、この関数は64を返します。
66+ * 戻り値として32ビットなら 32 を返します。64ビットなら 64 を返します。
67+ */
68+int GetPlatformArchitecture()
69+{
70+ char buf[256];
71+ if(GetEnvironmentVariable("PROCESSOR_ARCHITECTURE", buf, 256))
72+ {
73+ if(strstr(buf, "64") >= 0)
74+ {
75+ return 64;
76+ }
77+ else if(GetEnvironmentVariable("PROCESSOR_ARCHITEW6432", buf, 256))
78+ {
79+ if(strstr(buf, "64") >= 0)
80+ {
81+ return 64;
82+ }
83+ }
84+ }
85+ return 32;
86+}
87+
6288 JNIEnv* CreateJavaVM(LPTSTR vm_args_opt, LPTSTR systemClassLoader, BOOL useServerVM, BOOL useSideBySideJRE, int* err)
6389 {
6490 JNIGetDefaultJavaVMInitArgs getDefaultJavaVMInitArgs;
@@ -467,12 +493,8 @@
467493 jre3[0] = '\0';
468494 if(GetEnvironmentVariable("JAVA_HOME", jre3, MAX_PATH) == 0)
469495 {
470- char* subkeys[] =
496+ char* subkeys_native[] =
471497 {
472- "SOFTWARE\\Wow6432Node\\JavaSoft\\JDK", //Java9-
473- "SOFTWARE\\Wow6432Node\\JavaSoft\\JRE", //Java9-
474- "SOFTWARE\\Wow6432Node\\JavaSoft\\Java Development Kit",
475- "SOFTWARE\\Wow6432Node\\JavaSoft\\Java Runtime Environment",
476498 "SOFTWARE\\JavaSoft\\JDK", //Java9-
477499 "SOFTWARE\\JavaSoft\\JRE", //Java9-
478500 "SOFTWARE\\JavaSoft\\Java Development Kit",
@@ -479,12 +501,24 @@
479501 "SOFTWARE\\JavaSoft\\Java Runtime Environment",
480502 NULL
481503 };
504+
505+ char* subkeys_wow[] =
506+ {
507+ "SOFTWARE\\Wow6432Node\\JavaSoft\\JDK", //Java9-
508+ "SOFTWARE\\Wow6432Node\\JavaSoft\\JRE", //Java9-
509+ "SOFTWARE\\Wow6432Node\\JavaSoft\\Java Development Kit",
510+ "SOFTWARE\\Wow6432Node\\JavaSoft\\Java Runtime Environment",
511+ NULL
512+ };
513+
514+ char** subkeys = subkeys_native;
482515 char* output = (char*)HeapAlloc(GetProcessHeap(), 0, MAX_PATH);
483516 int i = 0;
484-
485- if (GetProcessArchitecture() == 64)
517+
518+ //32ビットプロセスを64ビットOSで実行している場合はWowレジストリから検索します。
519+ if(GetProcessArchitecture() == 32 && GetPlatformArchitecture() == 64)
486520 {
487- i = 2; //64ビットEXEの場合は 32ビットJREに適合しないので、Wow6432 レジストリの検索をスキップします。
521+ subkeys = subkeys_wow;
488522 }
489523
490524 while(subkeys[i] != NULL)
--- exewrap/trunk/exewrap/src/exewrap.c (revision 43)
+++ exewrap/trunk/exewrap/src/exewrap.c (revision 44)
@@ -84,7 +84,7 @@
8484 exe_file = argv[0];
8585 }
8686
87- printf("exewrap 1.2.1 for %s (%d-bit) \r\n"
87+ printf("exewrap 1.2.2 for %s (%d-bit) \r\n"
8888 "Native executable java application wrapper.\r\n"
8989 "Copyright (C) 2005-2017 HIRUKAWA Ryo. All rights reserved.\r\n"
9090 "\r\n"
Show on old repository browser