2015-04-06 59 views
3

解包我找到了我一直在尋找,他應該將文件解包安裝 後,這是InnoUnzip.ZIP解壓縮文件與InnoUnzip安裝後 - 錯誤「無效的原型」

我的安裝程序文件夾是這樣的:

enter image description here

我的代碼:

[Setup] 
AppName=My Program 
AppVersion=1.0 
DefaultDirName={pf}\My Program 
DisableProgramGroupPage=yes 
UninstallDisplayIcon={app}\MyProg.exe 
OutputDir=userdocs:Inno Setup Examples Output 

[Files] 
Source: "unzipper.dll"; Flags: dontcopy 
Source: "MyProg.exe"; DestDir: "{app}" 
Source: "Somefile.zip"; DestDir: "{app}"; AfterInstall: ExtractMe('{app}\Somefile.zip', '{app}'); 

[Icons] 
Name: "{commonprograms}\My Program"; Filename: "{app}\MyProg.exe" 
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe" 

[Code] 
procedure unzip(src, target: AnsiString); 
external '[email protected]:unzipper.dll stdcall delayload'; 

procedure ExtractMe(src, target : AnsiString); - ERROR HERE!!!!! 
begin 
    unzip(ExpandConstant(src), ExpandConstant(target)); 
end; 

文本錯誤:「Extract Me」的原型無效

+0

您正在使用Unicode Inno Setup,它需要該AfterInstall原型的Unicode字符串。使用此過程ExtractMe(src,target:string);'。然後,當你將這些參數傳遞給插件類型轉換'unzip(AnsiString(ExpandConstant(src)),AnsiString(ExpandConstant(target)));'。無論如何,該插件有點懶,我相信它的代碼可以直接從Inno Setup腳本執行。 – TLama 2015-04-06 15:54:27

回答

1

將參數類型AnsiString更改爲String。

3

跟隨TLama關於DLL冗餘的觀點:只需在Inno Setup腳本中直接編碼UnZip()即可達到同樣的效果。

const 
    SHCONTCH_NOPROGRESSBOX = 4; 
    SHCONTCH_RESPONDYESTOALL = 16; 

procedure Unzip(ZipFile, TargetFolder: String); 
var 
    ShellObj, SrcFile, DestFolder: Variant; 
begin 
    ShellObj := CreateOleObject('Shell.Application'); 
    SrcFile := ShellObj.NameSpace(ZipFile); 
    DestFolder := ShellObj.NameSpace(TargetFolder); 
    DestFolder.CopyHere(SrcFile.Items, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL) 
end; 

procedure ExtractMe(src, target : String); 
begin 
    // Add extra application code here, then: 
    Unzip(ExpandConstant(src), ExpandConstant(target)); 
end; 

的Inno Setup的腳本代碼是DLL的或多或少一樣的...只是有點短。

注意,如果Zip或目標文件夾不存在,NameSpace()方法調用返回NullCopyHere()失敗,並且用戶將看到一個粗魯和莫名其妙的對話 - 所以最好在致電前檢查。

+0

我在Windows 10的安裝程序中使用了您的代碼,它像一個魅力一樣工作,謝謝。但是,它在Windows 7上不起作用。安裝完成時沒有錯誤,但不提取zip。我檢查了innosetup編譯器,所有變量都有正確的值。一切似乎都與我在Windows 10上的測試一樣。任何想法,問題可能是什麼? – Dulkan 2016-03-23 15:18:13

+0

@Dulkan:我已經在W7和W8下測試了它,並且它在兩者上都能正常工作(我記得因爲W8可以在解壓縮的時候生成一個性感的進度圖,而W7的性能對話更少)。所以我很困惑。它應該去。如果你運行它顯示進度框,你看到什麼? 這種方法取決於外殼的拉伸能力 - 我認爲這是目標W7機器上的所有功能都很好?例如,我想呢,WinZip的破解副本可能會殺死它? – willw 2016-03-24 11:03:42

+0

嗯,這可能是。 Win7機器使用WinRAR,是一款經常格式化的裸機測試機器。基本的winzip可能沒有安裝在那裏?使用進度框,也沒有任何反應,安裝程序會在安裝程序在目錄中安裝zip文件後立即完成安裝。 – Dulkan 2016-03-24 12:12:28