Tải bản đầy đủ (.pdf) (16 trang)

Công thức để tạo một chương trình portable màu làm bằng NSIS pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (107.95 KB, 16 trang )

;
***********************************************************
***************
; Tên: Portable
;
; Phiên bản:
;
; Website:
;
; Được viết cho:
; NSIS 2.17 hoặc cao hơn
; Các plugin cần thiết: NewAdvSplash, Registry, FindProcDLL,
Messagebox
;
; Giấy phép:
; Copyright© 2006 by
;
; Những thông tin về cài đặt, cấu trúc thư mục v.v có thể đọc trong file
readme.txt.
;
; Lưu ý: Khi sao lưu những thư mục và file có sẵn, có thể mất rất nhiều
thời gian
; tùy thuộc vào tốc độ ổ cứng USB của bạn. Nhớ lấy điều này!
; Cửa sổ trạng thái cho thấy việc sao chép được cho phép.
;
; Mẫu ứng dụng portable được tạo vào năm 2006 bởi Karl Loncarek,
phiên bản 1.4.1 - 2006/11/30
; Giấy phép của mẫu này xem ở file readme.txt.
;
***********************************************************
***************



;
***********************************************************
***************
; * Định nghĩa các hằng số (Define constants)
;
***********************************************************
***************
!define AUTHOR "" ; tên bạn
!define APP "" ; chèn tên ứng dụng, Ví dụ "TestApp"
!define VER "0.0.0.0" ; chèn phiên bản của chương trình
!define EXE "" ; chèn tên file EXE, Ví dụ "testapp.exe"
!define PNAME "${App}Portable" ; định dạng tên portable (các thư mục
và tên file)
!define ICON "${PNAME}.ico" ; chú thích dòng này khi sử dụng icon
mặc định
!define SPLASHIMAGE "${PNAME}.jpg" ; chú thích dòng này khi
không dùng ảnh splashscreen
!define REGKEYS "" ; chèn các khóa registry sử dụng, phân cách bởi
"||", chú thích khi không dùng
!define SETTINGSFILES "" ; chèn các file thiết lập dùng đến, phân cách
bởi "||" được lưu trữ trong máy host, Ví dụ "$WINDIR\TEST.INI", chú
thích ra khi không dùng
!define SETTINGSDIRS "" ; chèn các thư mục thiết lập dùng đến, phân
cách bởi "||" được lưu trữ trong máy host, Ví dụ "$PROFILE\TEST", chú
thích ra khi không dùng
!define INI "${PNAME}.ini" ; có thể thay đổi khi thiết lập của nhiều
chương trình được lưu trong 1 file .INI

;

***********************************************************
***************
; * Includes (Bao gồm)
;
***********************************************************
***************
!include "Registry.nsh" ; thêm các macro thao tác registry, không được
bao gồm mặc định trong NSIS
!include "WordFunc.nsh" ; thêm header cho thao tác với word
!insertmacro "WordFind" ; thêm chức năng chia tách chuỗi
!include "FileFunc.nsh" ; thêm header cho thao tác với file
!insertmacro "GetParameters" ; thêm chức năng tìm lại các tham số dòng
lệnh

;
***********************************************************
***************
; * Runtime Switches (chuyển đổi thời gian thực)
;
***********************************************************
***************
CRCCheck On ; tiến hành CRC (cycle redundancy check) check của
launcher trước khi bắt đầu("Off" cho việc nén EXE sau này)
WindowIcon Off ; không hiển thị icon của launcher
SilentInstall Silent ; bắt đầu như launcher, không phải installer
AutoCloseWindow True ; tự động đóng khi kết thúc

;
***********************************************************
***************

; * Định nghĩa các biến (Define variables)
;
***********************************************************
***************
Var ACTION
Var ACTIONDIRECTORY
Var ACTIONPARAMETERS
Var SPLASHSCREEN ; thông tin splash screen có được hiện ra không,
mặc định là có
Var PROGRAMEXE ; tên của file EXE cần chạy
Var PROGRAMDIR ; đường dẫn của file EXE ở trên
Var PROGRAMPARMS ; các tham số thêm vào khi chạy file EXE
Var DATADIR ; đường dẫn tới thư mục nơi lưu tất cả các thiết lập
Var INIFILE ; đường dẫn đầy đủ tới file INI tìm được
Var SECONDLAUNCH ; file EXE có được chạy lần thứ 2 hay không

;
***********************************************************
***************
; * Set basic information ( thiết lập các thông tin cơ bản)
;
***********************************************************
***************
Name "${APP} Portable"
!ifdef ICON
Icon "${ICON}"
!endif
Caption "${APP} Portable - ${VER}"
OutFile "${PNAME}.exe"


;
***********************************************************
***************
; * Set version information (Thiết lập thông tin phiên bản)
;
***********************************************************
***************
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
VIProductVersion "${Ver}"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Tên sản phẩm"
"${APP} Portable"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Chú thích" "Cho
phép ${APP} chạy trên 1 ổ cứng lưu động."
VIAddVersionKey /LANG=${LANG_ENGLISH} "Bản quyền hợp
pháp" "© ${AUTHOR}"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Tên công ty" "by
${AUTHOR}"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Mô tả file" "${APP}
Portable"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Phiên bản của file"
"${VER}"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Tên file gốc"
"${PNAME}.exe"

;
***********************************************************
***************
; * Hàm: Các khởi chạy khác trước khi chạy chương trình
;
***********************************************************

***************
Function Init
FunctionEnd

;
***********************************************************
***************
; * Hàm: Các thứ cần dọn sạch trước khi kết thúc chương trình
;
***********************************************************
***************
Function CleanUp
FunctionEnd

;
***********************************************************
***************
; * Function: Initialize working variables (Hàm chạy các biến làm việc)
;
***********************************************************
***************
Function InitVariables
;
; Kiểm tra xem file INI có tồn tại không, thiết lập biến trỏ đến nó
;
IfFileExists "$EXEDIR\${INI}" "" CheckPortableINI
StrCpy "$INIFILE" "$EXEDIR\${INI}"
Goto ReadINIFile
CheckPortableINI:
IfFileExists "$EXEDIR\${PNAME}\${INI}" ""

CheckPortableAppsINI
StrCpy "$INIFILE" "$EXEDIR\${PNAME}\${INI}"
Goto ReadINIFile
CheckPortableAppsINI:
IfFileExists "$EXEDIR\PortableApps\${PNAME}\${INI}"
"" CheckAppsINI
StrCpy "$INIFILE"
"$EXEDIR\PortableApps\${PNAME}\${INI}"
Goto ReadINIFile
CheckAppsINI:
IfFileExists "$EXEDIR\Apps\${PNAME}\${INI}" ""
CheckDataINI
StrCpy "$INIFILE"
"$EXEDIR\Apps\${PNAME}\${INI}"
Goto ReadINIFile
CheckDataINI:
IfFileExists "$EXEDIR\Data\${PNAME}\${INI}" ""
NoINIFile
StrCpy "$INIFILE"
"$EXEDIR\Data\${PNAME}\${INI}"
Goto ReadINIFile
Goto NoINIFile
;
; Read content of the INI file (Đọc nội dung file INI)
;
ReadINIFile:
ReadINIStr $0 "$INIFILE" "${PNAME}" "Thư mục chương
trình"
StrCmp $0 "" NoINIFile ; nếu trống rỗng lấy lại thiết lập
đúng

StrCpy "$PROGRAMDIR" "$EXEDIR\$0" ; lưu thư mục
chương trình
ReadINIStr $0 "$INIFILE" "${PNAME}" "Thư mục dữ
liệu"
StrCmp $0 "" NoINIFile ; nếu trống rỗng lấy lại thiết lập
đúng
StrCpy "$DATADIR" "$EXEDIR\$0" ; lưu thư mục dữ liệu
ReadINIStr $0 "$INIFILE" "${PNAME}" "file .EXE của
chương trình"
StrCpy "$PROGRAMEXE" "$0" ; lưu tên file .exe
StrCmp $0 "" "" Splash ; nếu trống rỗng dùng tên mặc định
StrCpy "$PROGRAMEXE" "${EXE}" ; cho giá trị mặc
định
Splash:
ReadINIStr $0 "$INIFILE" "${PNAME}"
"SplashScreen"
StrCpy "$SPLASHSCREEN" "$0" ; lưu trạng thái của
màn hình Splashscreen
StrCmp "$SPLASHSCREEN" "" "" Các tham số
chương trình ; kiểm tra xem biết splashscreen có trống rỗng không
StrCpy "$SPLASHSCREEN" "enabled" ; cho giá trị
mặc định
ProgramParameters:
ReadINIStr $0 "$INIFILE" "${PNAME}" "Tham số
chương trình"
StrCpy "$PROGRAMPARMS" "$0" ; lưu các tham số
bổ sung
Goto InitVarEnd ; kết thúc việc đọc file INI
NoINIFile: ; thiết lập mặc định cho tất cả các biến
;


; Set default values for variables (Cho biến các giá trị mặc
định)
;

StrCpy "$PROGRAMEXE" "${EXE}" ; dùng thiết lập mặc
định
StrCpy "$PROGRAMPARMS" ""
StrCpy "$SPLASHSCREEN" "enabled" ; cho phép
splashscreen
;

; Kiểm tra cấu hình thư mục nào được dùng và thiết lập các
biến theo đó
;

IfFileExists "$EXEDIR\App\${APP}\$PROGRAMEXE" ""
CheckPortableDIR
StrCpy "$PROGRAMDIR" "$EXEDIR\App\${APP}"
StrCpy "$DATADIR" "$EXEDIR\Data"
Goto InitVarEnd
CheckPortableDIR:
IfFileExists
"$EXEDIR\${PNAME}\App\${APP}\$PROGRAMEXE" ""
CheckPortableAppsDIR
StrCpy "$PROGRAMDIR"
"$EXEDIR\${PNAME}\App\${APP}"
StrCpy "$DATADIR" "$EXEDIR\${PNAME}\Data"
Goto InitVarEnd
CheckPortableAppsDIR:

IfFileExists
"$EXEDIR\PortableApps\${PNAME}\App\${APP}\$PROGRAMEXE"
"" CheckAppsDIR
StrCpy "$PROGRAMDIR"
"$EXEDIR\PortableApps\${PNAME}\App\${APP}"
StrCpy "$DATADIR"
"$EXEDIR\PortableApps\${PNAME}\Data"
Goto InitVarEnd
CheckAppsDIR:
IfFileExists
"$EXEDIR\Apps\${PNAME}\${APP}\$PROGRAMEXE" "" NoDIR
StrCpy "$PROGRAMDIR"
"$EXEDIR\Apps\${PNAME}\${APP}"
StrCpy "$DATADIR" "$EXEDIR\Data\${PNAME}"
Goto InitVarEnd
NoDIR:
;

; Không tìm thấy cấu hình thư mục được cho phép nào
;

MessageBox MB_OK|MB_ICONEXCLAMATION
`$PROGRAMEXE không tìm thấy. Xin kiểm tra cấu hình của bạn`
Abort ; kết thúc launcher
InitVarEnd: ;kết thúc hàm
FunctionEnd

;
***********************************************************
***************

; * Hàm: Làm việc với các khóa hoặc cây registry (backup, restore,
delete)
;
***********************************************************
***************
Function DoAction
StrCmp "$ACTIONPARAMETERS" "" Sau vòng lặp ; nếu không
có tham số nào thì thôi ngay
StrCpy "$R8" "0" ; reset bộ đếm
StrCpy "$R2" "$ACTION" 6 # ; chỉ lấy 6 ký tự đầu của hành động
đc yêu cầu
StrCmp "$R2" "Backup" "" GoOn ; sao lưu thư mục yêu cầu
IfFileExists "$ACTIONDIRECTORY\*.*" GoOn ; tạo thư mục sao
lưu nếu nó không tồn tại
CreateDirectory $ACTIONDIRECTORY
GoOn:
StrCpy "$R0" "$ACTIONPARAMETERS" ; chép hằng số để làm
việc đăng ký
Loop:
;

; Lấy tham số đơn ra khỏi danh sách
;

StrCmp "$R0" "" Sau vòng lặp ; không phân tích registry,
khi không có khóa nào được đưa ra
IntOp $R8 $R8 + 1 ; tăng bộ đếm
${WordFind} "$R0" "||" "+01" $R9 ; lưu tham số đầu tiên để
đăng ký
${WordFind} "$R0" "||" "+02*}" $R0 ; xóa phần đầu tiên từ

giá trị đã lưu
StrCmp "$R0" "$R9" LastLoop ; nếu các giá trị đăng ký
trùng nhau -> không còn delimiters
Goto DoWork ; không xóa danh sách giá trị
LastLoop:
StrCpy "$R0" "" ; Nếu không có delimiter sẵn có thì làm
trống rỗng các biến làm việc
;

;Quyết định làm gì với tham số
;

DoWork:
StrCpy "$R2" "$ACTION" "" -4 # ; lấy 7 ký tự cuối của biến
hoạt động
!ifdef REGKEYS
StrCmp "$R2" "Keys" DoWorkRegistry ; hành động
phải được thực hiện với registry
!endif
!ifdef SETTINGSFILES
StrCmp "$R2" "File" DoWorkFiles ; hành động phải
được thực hiện với file
!endif
!ifdef SETTINGSDIRS
StrCmp "$R2" "Dirs" DoWorkDirectory ; hành động
phải được thực hiện với các thư mục
!endif
Goto Continue ; có gì đó không xác định
;


; Thao tác với các khóa registry
;

!ifdef REGKEYS
DoWorkRegistry:
StrCmp "$ACTION" "BackupKeys"
BackupRegistryKey ; sao lưu khóa registry
StrCmp "$ACTION" "RestoreKeys"
RestoreRegistryKey ; phục hồi khóa registry, VD ghi chúng vào registry
StrCmp "$ACTION" "DeleteKeys"
DeleteRegistryKey ; Xóa các khóa registry
Goto Continue ; có gì đó không xác định
BackupRegistryKey:
${registry::KeyExists} "$R9" $R7 ; kiểm tra
khóa registry có tồn tại hay không
StrCmp "$R7" "0" 0 Continue ; khóa registry
không tồn tại, không lưu lại gì cả
${registry::SaveKey} "$R9"
"$ACTIONDIRECTORY\RegKey$R8.reg" "/G=1" $R7 ; Sao lưu khóa
registry
Sleep 50
Goto Continue
RestoreRegistryKey:
IfFileExists
"$ACTIONDIRECTORY\RegKey$R8.reg" 0 Continue ; chỉ phục hồi nếu
1 file registry tồn tại
${registry::RestoreKey}
"$ACTIONDIRECTORY\RegKey$R8.reg" $R7 ; Phục hồi các khóa
registry đã lưu
Sleep 50

Goto Continue
DeleteRegistryKey:
${registry::DeleteKey} "$R9" $R7 ; Xóa khóa
registry
Sleep 50
Goto Continue
!endif
;

; Thao tác với file
;

!ifdef SETTINGSFILES
DoWorkFiles:
StrCmp "$ACTION" "BackupFile" BackupFile
; thực hiện sao lưu file
StrCmp "$ACTION" "RestoreFile" RestoreFile
; phục hồi các file đã lưu, VD ghi nó vào máy host
StrCmp "$ACTION" "DeleteFile" DeleteFile ;
xóa file từ host computer
BackupFile:
IfFileExists "$R9" 0 Continue ; kiểm tra xem
file có tồn tại hay không
CopyFiles "$R9"
"$ACTIONDIRECTORY\File$R8.dat" ; sao lưu file
Goto Continue
RestoreFile:
IfFileExists
"$ACTIONDIRECTORY\File$R8.dat" 0 Continue ; chỉ phục hồi khi file
có sẵn

CopyFiles
"$ACTIONDIRECTORY\File$R8.dat" "$R9" ; phục hồi file
Goto Continue
DeleteFile:
Delete "$R9" ; xóa file
Goto Continue
!endif
;

; Thao tác với thư mục
;

!ifdef SETTINGSDIRS
DoWorkDirectory:
StrCmp "$ACTION" "BackupDirs"
BackupDirectory ; sao lưu thư mục
StrCmp "$ACTION" "RestoreDirs"
RestoreDirectory ; phục hồi thư mục đã sao lưu, VD ghi nó vào máy host
StrCmp "$ACTION" "DeleteDirs"
DeleteDirectory ; xóa thư mục từ máy host
BackupDirectory:
IfFileExists "$R9\*.*" 0 Continue ; kiểm tra
xem thư mục nguồn có tồn tại hay không
IfFileExists
"$ACTIONDIRECTORY\Dir$R8.dat" +2 0 ; thư mục đích có tồn tại hay
không?
CreateDirectory
"$ACTIONDIRECTORY\Dir$R8.dat" ; tạo thư mục đích
CopyFiles "$R9\*.*"
"$ACTIONDIRECTORY\Dir$R8.dat" ; sao lưu thư mục

Goto Continue
RestoreDirectory:
IfFileExists
"$ACTIONDIRECTORY\Dir$R8.dat\*.*" 0 Continue ; kiểm tra xem các
sao lưu có tồn tại không
IfFileExists "$R9\*.*" +2 0 ; thư mục đích có
tồn tại không
CreateDirectory "$R9" ; create target directory
CopyFiles
"$ACTIONDIRECTORY\Dir$R8.dat\*.*" "$R9" ; phục hồi các thư mục
Goto Continue
DeleteDirectory:
RMDir "/r" "$R9" ; xóa thư mục
Goto Continue
!endif
;

; End of Loop
;

Continue:
Goto Loop
AfterLoop:
FunctionEnd

;
***********************************************************
***************
; * Hàm: Kiểm tra xem file EXE tồn tại có được chạy lần thứ 2 hay không
;

***********************************************************
***************
Function CheckEXE
IfFileExists "$PROGRAMDIR\$PROGRAMEXE" FoundEXE
; file EXE không ở thư mục mong đợi
MessageBox MB_OK|MB_ICONEXCLAMATION
`$PROGRAMEXE không tìm thấy. kiểm tra lại cấu hình của bạn!`
Abort
FoundEXE: ; kiểm tra xem đã chạy hay chưa và thiết lập biến
FindProcDLL::FindProc "$PROGRAMEXE"
StrCmp $R0 "1" "" EndEXE
StrCpy $SECONDLAUNCH "true"
EndEXE:
FunctionEnd

;
***********************************************************
***************
; * Main section (Phần chính)
;
***********************************************************
***************
Section "Main"
;
; Khởi chạy các biến, đọc file INI v.v…
;
Call InitVariables
;
; Thực hiện kiểm tra EXE
;

Call CheckEXE
;
; Hiển thị Splashscreen nếu có sẵn
;
!ifdef SPLASHIMAGE
StrCmp "$SPLASHSCREEN" "enabled" 0 NoSplash
InitPluginsDir
File /oname=$PLUGINSDIR\splash.jpg
"${SPLASHIMAGE}"
newadvsplash::show /NOUNLOAD 2500 200 200 -1 /L
$PLUGINSDIR\splash.jpg
NoSplash:
!endif
StrCmp $SECONDLAUNCH "true" SimplyStartProgram
;
; Sao lưu những khóa registry tồn tại, thay thế bằng các khóa
registry đã lưu
;
!ifdef REGKEYS
StrCpy "$ACTIONPARAMETERS" "${REGKEYS}" ; bàn
giao danh sách tham số
StrCpy "$ACTIONDIRECTORY"
"$DATADIR\RegistryBackup" ; xác định nơi sao lưu các khóa
StrCpy "$ACTION" "BackupKeys" ; sao lưu các khóa
registry tồn tại
Call DoAction ; thực hiện hành động
; StrCpy "$ACTION" "DeleteKeys" ; xóa các khóa registry
tồn tại
; Call DoAction
StrCpy "$ACTIONDIRECTORY" "$DATADIR\Registry" ;

xác định các khóa local ở đâu
StrCpy "$ACTION" "RestoreKeys" ;phục hồi các khóa đã
lưu
Call DoAction ; thực hiện hành động
!endif
;
; Sao lưu những cái đã có, thay thế bằng các file thiết lập đã lưu
;
!ifdef SETTINGSFILES
StrCpy "$ACTIONPARAMETERS"
"${SETTINGSFILES}" ; bàn giao danh sách tham số
StrCpy "$ACTIONDIRECTORY"
"$DATADIR\SettingsBackup" ; xác định nơi lưu file
StrCpy "$ACTION" "BackupFile" ; xác định hành động
Call DoAction ; thực hiện hành động
StrCpy "$ACTIONDIRECTORY" "$DATADIR\Settings" ;
xác định nơi chứa các file local
StrCpy "$ACTION" "RestoreFile" ; xác định hành động
Call DoAction ; thực hiện hành động
!endif
;
; Sao lưu các thư mục thiết lập sẵn có
;
!ifdef SETTINGSDIRS
StrCpy "$ACTIONPARAMETERS" "${SETTINGSDIRS}"
; bàn giao danh sách tham số
StrCpy "$ACTIONDIRECTORY"
"$DATADIR\SettingsBackup" ; xác định nơi lưu các thư mục
StrCpy "$ACTION" "BackupDirs" ; xác định hành động
Call DoAction ; thực hiện hành động

StrCpy "$ACTIONDIRECTORY" "$DATADIR\Settings" ;
xác định các thư mục Local ở đâu
StrCpy "$ACTION" "RestoreDirs" ; xác định hành động
Call DoAction ; thực hiện hành động
!endif
;
; Các thay đổi khác trước khi chạy chương trình
;
Call Init
;
; Chạy chương trình
;
${GetParameters} $R0 ; thu được các tham số dòng lệnh cuối cùng
ExecWait "$PROGRAMDIR\$PROGRAMEXE
$PROGRAMPARMS $R0" ; chạy chương trình
;
; Các hành động dọn sạch khác sau khi chương trình đã chạy
;
Call CleanUp
;
; Sao lưu và phục hồi hoặc dọn sạch các thư mục thiết lập
;
!ifdef SETTINGSDIRS
StrCpy "$ACTIONPARAMETERS" "${SETTINGSDIRS}"
; bàn giao danh sách tham số
StrCpy "$ACTIONDIRECTORY" "$DATADIR\Settings" ;
xác định các thư mục local ở đâu
StrCpy "$ACTION" "BackupDirs" ; xác định hành động
Call DoAction ; thực hiện hành động
StrCpy "$ACTION" "DeleteDirs" ; xóa các thư mục trên

máy host
Call DoAction ; thực hiện hành động
StrCpy "$ACTIONDIRECTORY"
"$DATADIR\SettingsBackup" ; xác định nơi lưu thư mục
StrCpy "$ACTION" "RestoreDirs" ; xác định hành động
Call DoAction ; thực hiện hành động
!endif
;
; Sao lưu và phục hồi hoặc dọn sạch các file thiết lập
;
!ifdef SETTINGSFILES
StrCpy "$ACTIONPARAMETERS"
"${SETTINGSFILES}" ; bàn giao danh sách tham số
StrCpy "$ACTIONDIRECTORY" "$DATADIR\Settings" ;
xác định các file local ở đâu
StrCpy "$ACTION" "BackupFile" ; xác định hành động
Call DoAction ; thực hiện hành động
StrCpy "$ACTION" "DeleteFile" ; xóa các file trong máy
host
Call DoAction ; thực hiện hành động
StrCpy "$ACTIONDIRECTORY"
"$DATADIR\SettingsBackup" ; xác định nơi lưu thư mục
StrCpy "$ACTION" "RestoreFile" ; xác định hành động
Call DoAction ; thực hiện hành động
!endif
;
; sao lưu và phục hồi hoặc dọn sạch các khóa registry
;
!ifdef REGKEYS
StrCpy "$ACTIONPARAMETERS" "${REGKEYS}" ; bàn

giao danh sách tham số
StrCpy "$ACTIONDIRECTORY" "$DATADIR\Registry" ;
xác định các khóa local ở đâu
StrCpy "$ACTION" "BackupKeys" ; sao lưu các khóa
registry sẵn có
Call DoAction ; thực hiện hành động
StrCpy "$ACTION" "DeleteKeys" ; xóa các khóa registry
trong máy host
Call DoAction ; thực hiện hành động
sleep 500 ; để cho việc xóa các khóa registry kết thúc
StrCpy "$ACTIONDIRECTORY"
"$DATADIR\RegistryBackup" ; xác định nơi sao lưu các khóa
StrCpy "$ACTION" "RestoreKeys" ;phục hồi các khóa đã
lưu
Call DoAction ; thực hiện hành động
sleep 1000 ; để cho việc ghi vào registry kết thúc (cần thiết
trước khi xóa file lưu trữ)
!endif
${registry::Unload}
;
; xóa các file sao lưu
;
RMDir "/r" "$DATADIR\SettingsBackup"
RMDir "/r" "$DATADIR\RegistryBackup"
Goto EndOfCode
;
; chạy ứng dụng trực tiếp mà không làm gì khác, giống như nó đã
đang chạy rồi
;
SimplyStartProgram:

${GetParameters} $R0 ; lấy các tham số dòng lệnh cuối
cùng
Exec "$PROGRAMDIR\$PROGRAMEXE
$PROGRAMPARMS $R0" ; chạy chương trình
${registry::Unload}
EndOfCode:
SectionEnd


×