2013-03-19 11 views
9

Ich bin neu bei InnoSetup, da ich mit verschiedenen Installateuren experimentiere.Ungültiger Prototyp bei Verwendung einer Prüffunktion

Ich habe mein erstes Skript mit Inno Script Studio und den eingebauten Assistenten erstellt. So weit, ist es gut. Jetzt möchte ich herausfinden, ob .Net 4.5 installiert ist und wenn es nicht installiert ist. Also, ich habe überall im Web und hier nachgesehen und bin auf gestoßen, aber wenn ich den Code in mein Skript kopiere und einfüge, erhalte ich den folgenden Fehler beim Kompilieren.

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

und Linie 54 in meinem Skript ist dies

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

Wer weiß, was der Fehler bedeutet und warum ich es immer bin?

Hier ist meine vollständige Skript:

; 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; 

Antwort

12

Meine psychischen Kräfte mir sagen, dass Sie diese Funktion als check: zu verwenden sind versucht, Parameter. Da Funktionen, die mit check: Parametern verwendet werden, eine specific prototype haben müssen, schlägt der Compiler fehl.

Versuchen Sie, diese Stub-Funktion:

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

@ Gaz83 Sie erwähnen nicht explizit, dass Sie 'check:' Parameter verwenden. Das ist die eine Sache, die Sie über den ursprünglichen Artikel hinzugefügt haben, der das Problem verursacht hat. – Deanna

+0

@Deanna Tut mir leid, wenn das dumm klingt, aber was meinst du? Im Originalartikel verwendete der Autor ein 'check:' in einer 'InitializeSetup()' Funktion. Obwohl ich diese Funktion nicht verwende, führe ich immer noch ein 'check:'. Siehe die erste Zeile unter '[Run]' ... es sei denn, ich mache das total falsch lol – Gaz83

+0

Der Autor dieses Artikels benutzte diese Funktion als Eincheck-Code, nicht als ['Check'] (http: // jrsoftware.org/ishelp/topic_scriptcheck.htm#Check) Parameter eines Abschnittseintrags. – TLama

2

Beispiel der Prüfung für .Net 4 für 32-Bit-Systeme

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

Diese [ 'wäre better'] (http://pastebin.com/yUrFsFEA). – TLama

+0

@TLama - du könntest meine Antwort einfach korrigieren: D. Ich bin Millionen Meilen von Ihnen entfernt, wenn ich über Fähigkeiten und Wissen spreche ... – RobeN

Verwandte Themen