2011-11-06 118 views
3

在InnoSetup運行此代碼:InnoSetup:檢測如果Java是32位或64位

J32 := ShellExec('', 'java', '-d32 -version', '', SW_HIDE, ewWaitUntilTerminated, ec); 
J64 := ShellExec('', 'java', '-d64 -version', '', SW_HIDE, ewWaitUntilTerminated, ec); 

兩個J32J64True

在命令行:

> java -d32 -version 
Error: This Java instance does not support a 32-bit JVM. 
Please install the desired version. 

> echo %errorlevel% 
1 

> java -d64 -version 
java version "1.7.0" 
Java(TM) SE Runtime Environment (build 1.7.0-b147) 
Java HotSpot(TM) 64-Bit Server VM (build 21.0-b17, mixed mode) 

> echo %errorlevel% 
0 

爲什麼ShellExec()忽略Params

我試過Exec()也:

// this way 
J32 := Exec('java', '-d32 -version', '', SW_HIDE, ewWaitUntilTerminated, ec); 
// and this way 
J32 := Exec('>', 'java -d32 -version', '', SW_HIDE, ewWaitUntilTerminated, ec); 

他們都返回Trueec = 1,儘管我有一個64位Java。

似乎ExecShellExec回報True因爲他們成功運行java,但他們沒有跟蹤錯誤代碼java回報。

+0

ShellExec從不等待該過程完成。然而,你的倒數第二個命令('Exec('java','-d32 -version'...')看起來很好,它在運行後會在'ec'中出現什麼?'J32'中有什麼? –

+1

Pascal腳本: ShellExec文檔說:「Wait參數指定函數應該立即返回還是等待啓動的進程已經定製或空閒,」 – utapyngo

+0

'ec = 1'。當調用成功時,它始終爲1 'J32 = True' – utapyngo

回答

1

的創新安裝幫助狀態:

http://www.jrsoftware.org/ishelp/index.php?topic=setup_architecturesinstallin64bitmode

由{SYS}返回的System32下路徑在[DIRS]使用時恆定映射到默認64位 System目錄[Files], [InstallDelete],[Run],[UninstallDelete]和[UninstallRun] 部分。這是因爲當這些部分訪問的文件/目錄是 時,安裝/卸載會暫時禁用WOW64 文件系統重定向[外部鏈接]。在其他地方,System32和{sys}映射到32位系統目錄,正如在32位進程中一樣。

所以在[Code]部分的64位模式下,一切都是32位。它將執行32位Java和c:\ Windows \ System32指向WOW64文件夾,即32位版本的System32。

這樣的回答顯示瞭如何在註冊表中,而不是檢查的Java:

Need help on Inno Setup script - issue in check the jre install

下面這個問題的答案,下面的代碼看起來工作檢查64位的Java是否爲1.7+安裝:

[Code] 

function JavaIsMissing(): Boolean; 
var 
javaVersionOutput: AnsiString; 

begin 

result := not RegQueryStringValue(HKLM64, 'Software\JavaSoft\Java Runtime Environment', 
    'CurrentVersion', javaVersionOutput); 
if not result then 
    result := CompareStr(javaVersionOutput, '1.7') < 0; 
end; 

[Run] 
Filename: "{tmp}\{#JavaInstaller}"; StatusMsg: "Java Runtime Enviroment not installed on your system. Installing..."; Check: JavaIsMissing