I am writing a launcher in C++ to launch my java based GUI application on Windows. I am using CreateProcess to launch "javaw.exe". Everything works except for the fact that 32-bit version of "javaw.exe" is always launched.
When java is installed, it puts the executables "java.exe" and "javaw.exe" in %windir%\System32 on 32-bit windows. On 64-bit windows, it puts the same executables in %windir%\SysWow64.
There are 3 possibilities:
32-bit launcher executed on 32-bit windows: %windir%\System32 is in search path, and 32-bit javaw.exe is found. The GUI launches. Everything works.
32-bit launcher executed on 64-bit windows: %windir%\System32 is in search path. %windir%\System32 is redirected to %windir%\SysWow64 (since my launcher is 32 bit in this case). 32-bit javaw.exe is found. The GUI launches. Everything works.
64-bit launcher executed on 64-bit windows: %windir%\System32 is in search path. No redirection happens. It does not contain the executable javaw.exe. The launcher fails.
How do I launch 64-bit javaw.exe in the third case?
I finally found a solution (by digging through various posts on stackoverflow).
Recent versions of JRE when installed do put a copy of "javaw.exe" in System32. The previous versions of 64 bit JRE probably didn't (not sure).
In any case, the registry key HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Runtime Environment has a property CurrentVersion which points to the key for the default JRE for the system. The sub-key corresponding to the version number has a property JavaHome which points to the location of JRE installation.
If JRE/JDK is not installed, then the Java Runtime Environment key won't be found.
Related
I want to activate IIS on Windows Server 2012 via InstallShield setup. I tried the following DISM command:
DISM.EXE /enable-feature /online /featureName:IIS-WebServerRole /featureName:IIS-WebServer
Described here: Installing IIS 8.5 on Windows Server 2012 R2
When I execute my Setup, an error occurs:
The Process Monitor says, that DISM will be executed in C:\Windows\SysWOW64\DISM.EXE and results in Exit Status 11. As File Location I used [SystemFolder]. When I define File Location C:\Windows\System32 it also uses C:\Windows\SysWOW64\DISM.EXE.
What is a tough way to activate IIS?
Per this post, error code 11 indicates that the 32-bit version of DISM is being used on a 64-bit system. This corresponds with installing a 32-bit MSI on a 64-bit system and using it to locate and launch DISM. Windows Installer does not allow you to refer to 64-bit locations from a 32-bit MSI. Heath Stewart's article Different Packages are Required for Different Processor Architectures touches on this, but mostly from the angle of installing to 32- or 64-bit locations. As it turns out, finding files there is just as hard.
In order to launch a 64-bit DISM from a 64-bit location, you will need some other code. It may be possible to locate the 64-bit system folder from 32-bit code, but I know some 64-bit locations can only be correctly queried by 64-bit code. As such I would suggest you write a 64-bit helper exe to find and launch the 64-bit DISM. Then you will need two variants of your custom action so that you only try to use the 64-bit wrapper on a 64-bit system (when VersionNT64 is defined) and use a 32-bit wrapper or direct call on a 32-bit system.
Alternately, if upgrading and using an exe is an option, InstallShield 2013 and later include support for installing Windows Features as part of the Suite project type, which will thus handle this work for you. (Disclaimer: I am paid to work on InstallShield.)
here's my system specs;
Arch Linux x86_64,
Kernel: 3.6.10-1-ARCH,
Gnome 3.6.2,
xf86-video-nouveau 1.0.4-1,
jdk7-openjdk 7.u9_2.3.3-1,
jre7-openjdk 7.u9_2.3.3-1,
jre7-openjdk-headless 7.u9_2.3.3-1,
lib32-libjpeg-turbo 1.2.1-1, libjpeg-turbo 1.2.1-1, libjpeg6-turbo 1.2.1-1
libpng12 1.2.50-2,
net-tools 1.60.20120804git-2,
unzip 6.0-6.
Ok, so there's the list of requirements that are installed, version numbers as well. Upon launch, the loading/splash screen won't even show, and then nothing... it just dies out. I attempted to launch it "aptana -v" and no output in the shell. I have looked for any error logs in ~/ , but nothing is there.
Other steps I've done is to delete any configuration folders/files for eclipse and aptana-secure in ~/. Also did a clean uninstall of just Aptana (not the dependencies), reinstall. Same result.
Any suggestions?
It appears that there is a mix up in the downloads. 32-bit and 64-bit got switched. If you are on 32-bit download 64-bit and vice versa. Hopefully it will be fixed soon.
See issues below:
Aptana 64 bit version crashes on startup on 64bit Linux OS with 64bit Oracle 7 java
Linux Installer Aptana_Studio_3_Setup_Linux_x86_3.3.0.zip contains x64 bit version of the project
I try to uninstall Java ME SDK from Windows 7 x64, but it doesn't work for me.
If I choose Uninstall I get a progress bar, then it goes away, but the Software is still there.
On the first few times I did this, I got the same error message as in I need help UNINSTALLING Java ME SDK:
... show message dialog
title: Critical Error
message: Cannot load native library from path: native/jmesdk/windows/windows-x86.dll
Exception:
java.lang.UnsatisfiedLinkError:
C:\Users\Jonas\AppData\Local\Temp\nbi-8367277139934329064.tmp: Can't load IA 32-bit .dll on a AMD 64-bit platform
In ref to getting the uninstaller to use the 32-bit JRE, the config I attempted that failed to work:
a) Set the PATH environmental variable to point to the 32-bit JRE
b) Windows registry edits in HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\1.6 to point to the 32-bit JRE.
In a last ditch effort I renamed \Program Files\Java to Java2, and the uninstaller must have searched to find \Program Files (x86)\Java, the 32-bit JRE, and the uninstall worked.
Seriously, Sun/Oracle. Test your products.
I had the exact same problem and I figured it out. :)
It's because you have the 64-bit JRE installed. Either uninstall it or somehow redirect the J2ME uninstaller to use the 32-bit JRE on your system, so that the 32-bit uninstaller can run instead of the 64-bit uninstaller.
I had the same problem and figured the solution out. As mentioned above you need to make sure J2ME unnistaller only recognizes Java x86. The simplest way I found, instead of unnistalling Java x64, you only have to temporarily rename your Java x64 installation folder to anything you want. That is, rename the folder C:\Program Files\Java to, e.g, C:\Program Files\JavaTEMP.
Now run unnistaller. When finished rename the folder back it's previous name.
That's all.
Hope I helped.
Just perform the following steps and you will be done:
1) Click on the link below and click on any of the ...i586.exe link according to your system
http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html
2)Install the software without changing default settings.
3)Run cmd command and type the following:
C:\Java_ME_platform_SDK_3.0\uninstall.exe --javahome "C:\Program Files (x86)\Java\jre8"
4)[optional] uninstall java 8 from control panel which you downloaded to uninstall the above software.
Congratulations.. You just did it!!
Thank you for reading.. Any suggestions or aprreciation is welcomed..
Turns out I had exactly the same problem, uninstall java (TM) 7 64bit and locate the 32-bit java installer bone this download uninstall it and try to install the Sun Java Wireless Toolkit and uninstalled correctly.
Just run this command:
C:\Java_ME_platform_SDK_3.0\uninstall.exe --javahome "32-bit jre location"
Rather than temporarily moving the x64 JRE out of the way, just tell the J2ME SDK uninstaller to use the 32bit JRE:
C:\Java_ME_platform_SDK_3.0\uninstall.exe --javahome "C:\Program Files (x86)\Java\jre7"
Note that this provides the path to a JRE within the "Program Files (x86)" directory, which is the 32bit variant. I only had a Java 7 JRE, but this ought to work with a Java 6 JRE, also.
When compiling code with VC++, MSDN gives you the option between using the x86_amd64 toolset or the amd64 toolset (when calling vcvarsall.bat).
How do I choose between those two when compile x64 code? Will the amd64 option churn out more efficient x64 machine code than the cross compiler?
It has nothing to do with efficiency. The native and cross-compiler will both generate the same machine code. You will however gain some benefits by running a native 64-bit compiler process on a 64-bit workstation (larger registers, larger memory space, etc...).
The native compiler will only run on an 64-bit copy of Windows, so if your workstation is 32-bit this compiler won't even run.
The cross-compiler is meant to run on x86 machines even though it will run on a 64-bit copy of Windows via WoW; however, there is no reason to do this.
The page you link says it quite well:
x64 on x86 (x64 cross-compiler)
Allows
you to create output files for x64.
This version of cl.exe runs as a
32-bit process, native on an x86
machine and under WOW64 on a 64-bit
Widows operating system.
x64 on x64
Allows you to create output
files for x64. This version of cl.exe
runs as a native process on an x64
machine.
Thanks to Brian R. Bondy for the quote formatting
From what you linked:
x64 on x86 (x64 cross-compiler)
Allows
you to create output files for x64.
This version of cl.exe runs as a
32-bit process, native on an x86
machine and under WOW64 on a 64-bit
Widows operating system.
x64 on x64
Allows you to create output
files for x64. This version of cl.exe
runs as a native process on an x64
machine.
Paraphrased:
If you use x86_amd64, then you are typically developing on an x86 machine and you want to create x64 files that run natively on x64. You could also use this option on an x64 machine but your compiler will be running under WOW64 emulation.
If you use AMD64, then you are developing on an x64 machine and you want to create x64 files that run natively on x64. The compiler is running natively in x64. This option is more efficient to build x64 programs.
You may wonder why you would ever develop an x64 program on an x86 computer, since you can't run it you can't debug it. Well it's still useful for example if you have a build server which is x86 and that build server needs to generate both x86 and x64 outputs.
How is it possible for a compiler to run under x64 if it is an x86 based program (x86_amd64)? That is the same reason you can run any x86 program on your x64 machine... Thanks to WOW64 emulation.
What is WOW64 emulation:
WOW64 emulation happens when you run an x86 program on an x64 computer (or IA64). WOW64 stands for Windows 32 on Windows 64. It is an emulation layer on top of x64 machines which allow you to execute x86 programs.
Your file system operations will be redirected to WOW64 folders and your registry will be redirected to a subnode as well. For example when you try to obtain the folder for program files it will return c:\program files (x86)\ if you are using WOW64 but it will return c:\program files\ if you are using x64.
Another example, for the registry if you try to write to HKLM\Software\Something it will really redirect you to HKLM\SOFTWARE\Wow6432Node\Something without your x86 program's knowledge.
Running a native x64 build will be more efficient than running through WOW64 emulation Why? Because you don't have that extra emulation layer of transforming your 32bit calls into 64bit ones.
By the way if you are running the x64 version of Windows you can see which processes are running through WOW64 because they will have a *32 appended to the process name in the process list.
I have a Windows 2008 64-bit server and I have to install a 32-bit JRE, because my Java application uses 32-bit DLLs using JNI.
Unfortunately the java.exe is installed to C:\Windows\SysWow64 and when I start a console window or a batch file the installed java.exeis not found. (Because cmd.exe is a 64-bit application and sees the 64-bit version of the system directory which has no java.exe)
How can I make the installed java.exe available to batch files and the command line without to much messing around with the system configuration, causing other problems or preventing future updates to the JRE?
Don't rely on the java.exe that's in a Windows system directory; add the bin directory of your Java runtime environment to the PATH environment variable (if that's not too much "messing around with the system configuration").
Known issues when you install a 32 -bit JRE on a 64- bit Windows architecture machine:
Online Installation and Java Update features are not applicable to 64-bit architecture
The public JRE installed with the 32-bit JRE is not registered. You must set the PATH environment variable to point to JAVA_HOME \bin to register the JRE
http://www.oracle.com/technetwork/java/javase/install-windows-64-142952.html