2013-03-19 17 views
9

Sono nuovo in InnoSetup mentre sto sperimentando con vari programmi di installazione.Prototipo non valido quando si utilizza una funzione di controllo

Ho creato il mio primo script utilizzando Inno Script Studio e le procedure guidate integrate. Fin qui tutto bene. Ora voglio che venga rilevato se .Net 4.5 è installato e se non lo è, installalo. Quindi, ho cercato su tutto il web e qui e ho trovato this solution, tuttavia quando copio e incollo il codice nel mio script ottengo il seguente errore durante la compilazione.

Compiling [Code] section 
Compiler Error! 
Line 54: Column 10: Invalid prototype for 'IsDotNetDetected' 

e la linea 54 nel mio script è questo

function IsDotNetDetected(version: string; service: cardinal): boolean; 

qualcuno sa che cosa significa l'errore e perché sto ottenendo esso?

Ecco il mio script completo:

; Script generated by the Inno Setup Script Wizard. 
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 

#define MyAppName "AVO Log" 
#define MyAppVersion "0.1.0.1" 
#define MyAppPublisher "NA" 
#define MyAppExeName "AVO Log.exe" 

[Setup] 
; NOTE: The value of AppId uniquely identifies this application. 
; Do not use the same AppId value in installers for other applications. 
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 
AppId={{9476587F-A670-4E17-B8EA-A6FABB345968} 
AppName={#MyAppName} 
AppVersion={#MyAppVersion} 
;AppVerName={#MyAppName} {#MyAppVersion} 
AppPublisher={#MyAppPublisher} 
DefaultDirName={pf}\{#MyAppName} 
DefaultGroupName={#MyAppName} 
AllowNoIcons=yes 
OutputBaseFilename=setup 
Compression=lzma 
SolidCompression=yes 

[Languages] 
Name: "english"; MessagesFile: "compiler:Default.isl" 

[Tasks] 
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked 
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1 

[Files] 
Source: "G:\Common\Gareths Apps\dotNetFx45_Full_x86_x64.exe"; DestDir: {tmp}; Flags: deleteafterinstall; 
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\AVO Log.exe"; DestDir: "{app}"; Flags: ignoreversion 
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\GalaSoft.MvvmLight.Extras.WPF45.dll"; DestDir: "{app}"; Flags: ignoreversion 
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\GalaSoft.MvvmLight.WPF45.dll"; DestDir: "{app}"; Flags: ignoreversion 
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\GalaSoft.MvvmLight.WPF45.xml"; DestDir: "{app}"; Flags: ignoreversion 
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\Microsoft.Expression.Interactions.dll"; DestDir: "{app}"; Flags: ignoreversion 
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\Microsoft.Practices.ServiceLocation.dll"; DestDir: "{app}"; Flags: ignoreversion 
Source: "C:\Visual Studio 2010\Projects\AVO Log\AVO Log\bin\Release\System.Windows.Interactivity.dll"; DestDir: "{app}"; Flags: ignoreversion 
; NOTE: Don't use "Flags: ignoreversion" on any shared system files 

[Icons] 
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" 
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon 

[Run] 
Filename: "{tmp}\dotNetFx45_Full_x86_x64.exe"; Check: IsDotNetDetected('v4.5',0) 
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 

[Code] 
function IsDotNetDetected(version: string; service: cardinal): boolean; 
// Indicates whether the specified version and service pack of the .NET Framework is installed. 
// 
// version -- Specify one of these strings for the required .NET Framework version: 
// 'v1.1.4322'  .NET Framework 1.1 
// 'v2.0.50727' .NET Framework 2.0 
// 'v3.0'   .NET Framework 3.0 
// 'v3.5'   .NET Framework 3.5 
// 'v4\Client'  .NET Framework 4.0 Client Profile 
// 'v4\Full'  .NET Framework 4.0 Full Installation 
// 'v4.5'   .NET Framework 4.5 
// 
// service -- Specify any non-negative integer for the required service pack level: 
// 0    No service packs required 
// 1, 2, etc.  Service pack 1, 2, etc. required 
var 
key: string; 
install, release, serviceCount: cardinal; 
check45, success: boolean; 
begin 
// .NET 4.5 installs as update to .NET 4.0 Full 
if version = 'v4.5' then begin 
    version := 'v4\Full'; 
    check45 := true; 
end else 
    check45 := false; 

// installation key group for all .NET versions 
key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version; 

// .NET 3.0 uses value InstallSuccess in subkey Setup 
if Pos('v3.0', version) = 1 then begin 
    success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); 
end else begin 
    success := RegQueryDWordValue(HKLM, key, 'Install', install); 
end; 

// .NET 4.0/4.5 uses value Servicing instead of SP 
if Pos('v4', version) = 1 then begin 
    success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); 
end else begin 
    success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); 
end; 

// .NET 4.5 uses additional value Release 
if check45 then begin 
    success := success and RegQueryDWordValue(HKLM, key, 'Release', release); 
    success := success and (release >= 378389); 
end; 

result := success and (install = 1) and (serviceCount >= service); 
end; 

risposta

12

miei poteri psichici mi dicono che si sta cercando di usare questa funzione come check: parametro. Poiché le funzioni utilizzate con i parametri check: devono avere un valore specific prototype, il compilatore non funziona.

Provare a utilizzare questa funzione stub:

function CheckIsDotNetDetected(): boolean; 
begin 
    result := IsDotNetDetected('v4\Client', 0); 
end; 
+0

@ Gaz83 Non dici esplicitamente che stai usando i parametri 'check:'. Questa è l'unica cosa che hai aggiunto all'articolo originale che ha causato il problema. – Deanna

+0

@Deanna Scusa se questo suona stupido ma cosa intendi? Nell'articolo originale l'autore ha usato un 'check:' in una funzione 'InitializeSetup()'. Anche se non sto usando quella funzione, sto ancora eseguendo un 'check:'. Vedere la prima riga sotto '[Esegui]' ... a meno che non lo stia facendo completamente lol – Gaz83

+0

L'autore di quell'articolo ha usato quella funzione come codice di controllo, non come ['Verifica'] (http: // jrsoftware.org/ishelp/topic_scriptcheck.htm#Check) parametro di una voce di sezione. – TLama

2

Esempio di controllo per .Net 4 per sistemi a 32 bit

function NET4032(): Boolean; 
var 
InstallCheck : Cardinal; 
begin 
    RegQueryDWordValue(HKLM32, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full', 
'Install', InstallCheck); 
    if InstallCheck = $1 then 
     Result := false 
    else 
     Result := true; 
end; 
+1

Questo [ 'sarebbe better'] (http://pastebin.com/yUrFsFEA). – TLama

+0

@TLama - potresti correggere la mia risposta: D. I'm Million Miles Lontano da te quando parli di abilità e conoscenza ... – RobeN

Problemi correlati