2013-03-19 11 views
9

Jestem nowym użytkownikiem InnoSetup, ponieważ eksperymentuję z różnymi instalatorami.Nieprawidłowy prototyp podczas korzystania z funkcji Sprawdź

Pierwszy skrypt napisałem przy użyciu Inno Script Studio i wbudowanych kreatorów. Jak na razie dobrze. Teraz chcę go wykryć, jeśli .NET 4.5 jest zainstalowany, a jeśli nie jest to zainstaluj go. Rozglądałem się więc po sieci i tutaj i natknąłem się na this solution, jednak kiedy skopiuję i wklejaję kod do mojego skryptu, podczas kompilacji pojawia się następujący błąd.

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

i Linia 54 w moim skrypcie jest to

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

ktoś wie co oznacza błąd i dlaczego ja dostaję go?

Oto mój pełny scenariusz:

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

Odpowiedz

12

moich psychicznych powiedzieć, że próbujesz użyć tej funkcji jako check: parametr. Ponieważ funkcje używane z parametrami check: muszą mieć wartość specific prototype, kompilator się nie powiódł.

Spróbuj użyciu tej funkcji skrótowe:

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

@ Gaz83 Nie wyjaśniłeś wyraźnie, że używasz parametrów 'check:'. To jest jedna rzecz, którą dodałeś do oryginalnego artykułu, który spowodował problem. – Deanna

+0

@Deanna Przepraszam, jeśli to brzmi głupio, ale co masz na myśli? W oryginalnym artykule autor użył funkcji 'check:' w funkcji 'InitializeSetup()'. Chociaż nie używam tej funkcji, nadal używam 'check:'. Zobacz pierwszy wiersz w sekcji "[Uruchom]" ... chyba że całkowicie zrobię to źle lol – Gaz83

+0

Autor tego artykułu użył tej funkcji jako czek w kodzie, a nie jako ["Sprawdź"] (http: // jrsoftware.org/ishelp/topic_scriptcheck.htm#Check) parametr wpisu sekcji. – TLama

2

Przykład odprawy dla .Net 4 dla systemów 32-bitowych

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

Ten [ 'będzie better'] (http://pastebin.com/yUrFsFEA). – TLama

+0

@ TLama - możesz poprawić odpowiedź: D. Jestem miliony mil od ciebie, gdy mówisz o umiejętnościach i wiedzy ... – RobeN

Powiązane problemy