- recognize missing PATH entries for jre/bin and jre/bin/client during setup

git-svn-id: https://svn.code.sf.net/p/libusbjava/code/trunk@99 94ad28fe-ef68-46b1-9651-e7ae4fcf1c4c
This commit is contained in:
schlaepfer
2006-02-15 10:03:09 +00:00
parent 66c971de9e
commit 718f9fb4c5

View File

@@ -22,6 +22,7 @@ DefaultDirName={pf}\USB PD-Interface
DefaultGroupName=USB PD-Interface
Compression=lzma
SolidCompression=yes
ChangesEnvironment=yes
; WinMe or higher
MinVersion=4.9,5
PrivilegesRequired=admin
@@ -45,4 +46,145 @@ Name: "{group}\Uninstall USB PD-Interface"; Filename: "{uninstallexe}"
; invoke libusb's DLL to install the .inf file
Filename: "rundll32"; Parameters: "libusb0.dll,usb_install_driver_np_rundll {app}\driver\USBPDI.inf"; StatusMsg: "Installing Programming and Debugging Interface driver (this may take a few seconds) ..."
[Code]
const
WM_SETTINGCHANGE = $1A;
SMTO_ABORTIFHUNG = $2;
function SendMessageTimeout(hwnd :LongInt; msg :LongInt; wParam :LongInt;
lParam :String; fuFlags :LongInt; uTimeout :LongInt; var lpdwResult :LongInt): LongInt;
external 'SendMessageTimeoutA@user32.dll stdcall';
// NotifyWindows: The function will notify other running applications
// (notably Windows Explorer) that they should reload their environment
// variables from the registry.
// On Windows NT platforms, if the funtion is not called, the
// environment variable will not be seen by applications launched from
// Explorer until the user logs off or restarts the computer.
procedure NotifyWindows();
var
res :LOngInt;
begin
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0,'Environment', SMTO_ABORTIFHUNG, 5000, res);
end;
{returns true if s1 contains s2, else false (Case insensitive)}
function ContainsString(const s1, s2 :String):Boolean;
var
s1Lower, s2Lower :String; i, j, s1Length, s2Length:Integer;
begin
s1Lower := Lowercase(s1);
s2Lower := Lowercase(s2);
s1Length := Length(s1);
s2Length := Length(s2);
if s1Length < s2Length then begin
Result := False;
Exit;
end;
j := 1;
for i := 1 TO s1Length do begin
if j > s2Length then begin
Result := True;
Exit
end;
if s1Lower[i] = s2Lower[j] then begin
j := j + 1;
end else begin
j := 1;
end
end;
Result := False;
end;
function InitializeSetup(): Boolean;
var
Rootkey, Res: Integer; SubKeyName, ResultStr, ValueName, messageStr, JREPath, JREBin, JREBinClient, EnvPath: String;
javaInstalled, continueOnError, writeRegistry: Boolean;
begin
javaInstalled := True;
continueOnError := False;
rootKey := HKLM;
SubKeyName := 'SOFTWARE\JavaSoft\Java Runtime Environment';
ValueName := 'CurrentVersion';
if not RegQueryStringValue(RootKey, SubKeyName, ValueName, ResultStr) then
javaInstalled := False;
if javaInstalled then begin
if not RegQueryStringValue(RootKey, SubKeyName, ValueName, ResultStr) then begin
javaInstalled := False;
end else begin
SubKeyName := SubKeyName + '\' + ResultStr;
ValueName := 'JavaHome';
if not RegQueryStringValue(RootKey, SubKeyName, ValueName, JREPath) then
javaInstalled := False;
end;
end;
if not javaInstalled then begin
messageStr := 'No Java Runtime Environment found!' #13#10;
messageStr := messageStr + 'The JRE is needed to run this program.' #13#13;
messageStr := messageStr + 'If you continue, you need to set your PATH environment variable manualy to' #13#10;
messageStr := messageStr + 'JRE\bin and JRE\bin\client after installing the JRE from java.sun.com.' #13#13;
messageStr := messageStr + 'Do you want to continue?';
if MsgBox(messageStr, mbError, MB_YESNO) = idYes then
continueOnError := True;
end;
if javaInstalled then begin
Result := True;
{JREPath contains the path to the JRE directory (e.g. C:\Program Files\Java\jre1.5.0_06)}
{get the USER Path variable}
RootKey := HKCU;
SubKeyName := 'Environment';
ValueName := 'PATH';
JREBin := JREPath + '\bin';
JREBinClient := JREPath + '\bin\client';
{check if PATH is already set}
if not RegValueExists(RootKey, SubKeyName, ValueName) then begin
{create new PATH entry}
messageStr := 'In order to run the program the path to your JRE\bin and JRE\bin\client must be added.' #13#10;
messageStr := messageStr + 'Setup will added this paths to your User PATH variable.' #13#13;
messageStr := messageStr + 'Do you want Setup to modify your PATH variable?';
if MsgBox(messageStr, mbConfirmation, MB_YESNO) = idYes then begin
RegWriteStringValue(RootKey, SubKeyName, ValueName, JREBin + ';' + JREBinClient);
NotifyWindows();
end
end else begin
if RegQueryStringValue(RootKey, SubKeyName, ValueName, EnvPath) then begin
writeRegistry := False;
{check if EnvPath contains the right paths}
if not ContainsString(EnvPath, JREBin) then begin
{add to Path}
Res := Length(EnvPath);
if EnvPath[Res] = ';' then begin
end else begin
EnvPath := EnvPath + ';';
end;
EnvPath := EnvPath + JREBin;
writeRegistry := True;
end
if not ContainsString(EnvPath, JREBinClient) then begin
{add to Path}
Res := Length(EnvPath);
if EnvPath[Res] = ';' then begin
end else begin
EnvPath := EnvPath + ';';
end;
EnvPath := EnvPath + JREBinClient;
writeRegistry := True;
end
if writeRegistry then begin
messageStr := 'In order to run the program the path to your JRE\bin and JRE\bin\client must be added.' #13#10;
messageStr := messageStr + 'Setup will added this paths to your User PATH variable.' #13#13;
messageStr := messageStr + 'Do you want Setup to modify your PATH variable?';
if MsgBox(messageStr, mbConfirmation, MB_YESNO) = idYes then begin
RegWriteStringValue(RootKey, SubKeyName, ValueName, EnvPath);
NotifyWindows();
end
end
end else
continueOnError := True;
end;
end else
Result := False;
if continueOnError then
Result := True;
end;