Инсталлятор на PureBasic
Пример простого инсталлятора на языке
PureBasic
В качестве примера - создание инсталлятора для плеера.
Для работы кода нужна библиотека
PureZIP на сайте предоставлено для разных версий PB.
Подготавливаем за раннее все нужные файлы для инсталляции и помещаем в одну папку ( в данном варианте - это плеер).
PureSFX - программа для сжатия.
Инстал DarkSoft - графический вариант программы инсталлятора.(для каждой программы рисуем свой или делаем один универсальный скин)
Запускаем
PureSFX и указываем папку с плеером...
Результат должен получится похож на архив
.
Скачать архив всех файлов
PureSFX
;PureSFX v1.1 Archive Maker
;(c)2006 Trutia Alexandru
Enumeration
#Window_0
EndEnumeration
Global Image0,Count.l,FilesAdded,Path.s,TempZIP.s,File.s,Working,Threaddie
Image0 = CatchImage(0, ?Image0)
Procedure PureSFXCallback(File.s, PerCent.f, UserParam.l)
SetGadgetState(4,PerCent)
SetGadgetText(5,GetFilePart(File.s))
EndProcedure
Procedure PureSFXCount(EntryPath.s)
If Right(EntryPath.s,1)<>"\":EntryPath + "\":EndIf
Count.l
UsedDirectory = ExamineDirectory(#PB_Any, EntryPath, "*.*")
While NextDirectoryEntry(UsedDirectory)
EntryType.l = DirectoryEntryType(UsedDirectory)
EntryName.s = DirectoryEntryName(UsedDirectory)
If EntryName = "." Or EntryName = ".."
Continue
EndIf
If EntryType = #PB_DirectoryEntry_File
Count = Count + 1
EndIf
If EntryType = #PB_DirectoryEntry_Directory
PureSFXCount(EntryPath + EntryName)
EndIf
Wend: FinishDirectory(UsedDirectory)
ProcedureReturn Count
EndProcedure
Procedure.s PureSFXTempFile(name$)
tmpdir$ = GetTemporaryDirectory()
Repeat
tmp$ = tmpdir$ + name$ + Str(Random(99))
Until FileSize(tmp$) = -1
ProcedureReturn tmp$
EndProcedure
Procedure PureSFXMakeEXE(*x)
DisableGadget(6,1)
DisableGadget(7,1)
DisableGadget(3,1)
Count = PureSFXCount(Path)
FilesAdded = PureZIP_AddFiles(TempZIP, Path+"*.*", #PureZIP_StorePathRelative, #PureZIP_Recursive)
If Count = FilesAdded
If ReadFile(0,TempZIP)
SizeT = Lof(0)
*Temp = AllocateMemory(SizeT)
ReadData(0,*Temp,SizeT)
CloseFile(0)
CreateFile(0,File)
WriteData(0,?StubStart, ?StubEnd - ?StubStart)
WriteData(0,*Temp,SizeT)
WriteLong(0,SizeT)
CloseFile(0)
EndIf
EndIf
Debug SizeT
DeleteFile(TempZIP)
FreeMemory(*Temp)
MessageRequester("Готовы","Архив был успешно создан. "+Str(FilesAdded)+" файлы были добавлены.",#MB_ICONINFORMATION)
Working = 0
TempZIP = ""
Path = ""
File = ""
SizeT = 0
Count = 0
SetGadgetState(4,0)
DisableGadget(6,0)
DisableGadget(7,0)
DisableGadget(3,0)
SetGadgetText(5,"Готовые ...")
ProcedureReturn
EndProcedure
If OpenWindow(#Window_0, 405, 334, 253, 161, "PureSFX v1.0", #PB_Window_TitleBar )
StringGadget(0, 5, 60, 180, 20, "")
ImageGadget(1, 0, 0, 253, 34, Image0)
TextGadget(2, 5, 45, 245, 15, "Выберите папку:")
ButtonGadget(3, 190, 60, 60, 20, "Обзор")
ProgressBarGadget(4, 5, 110, 240, 15, 0, 100)
TextGadget(5, 5, 90, 240, 15, "Готовые ...")
ButtonGadget(6, 125, 135, 60, 20, "Выход")
ButtonGadget(7, 190, 135, 60, 20, "Сжать!")
ButtonGadget(8, 5, 135, 60, 20, "О прогр.")
EndIf
LoadFont(0,"Arial",8)
SetGadgetFont(#PB_Any,FontID(0))
;PureZIP_SetProgressionCallback(@PureSFXCallback())
Repeat
event = WaitWindowEvent()
If event = #PB_Event_Gadget
Select EventGadget()
Case 8
MessageRequester("О PureSFX","PureSFX v1.1"+Chr(10)+Chr(13)+Chr(10)+Chr(13)+"Описание: PureSFX это небольшая утилита, чтобы сделать"+Chr(10)+Chr(13)+"Самораспаковывающийся ZIP архивов."+Chr(10)+Chr(13)+"(c)2006 Trutia Alexandru."+Chr(10)+Chr(13)+"Особая благодарность Gnozal для PureZIP и все помогают.",64)
Case 6
End
Case 3
Path.s = PathRequester("Выберите путь, пожалуйста","")
If Path <> ""
If Right(Path,1) <> "\"
Path + "\"
EndIf
SetGadgetText(0,Path)
EndIf
Case 7
If Working = 1
KillThread(Threaddie)
Working = 0
EndIf
Path.s = GetGadgetText(0)
If Path <> ""
If Right(Path,1) <> "\"
Path + "\"
EndIf
File.s = SaveFileRequester("Пожалуйста, выберите файл, чтобы сохранить", "", "Исполняемые файлы (*. EXE) | *. EXE", 0)
If File <> ""
If Right(LCase(File),4) <> ".exe":File=File+".exe":EndIf
TempZIP.s = PureSFXTempFile("PureSFX")
PureZIP_SetProgressionCallback(@PureSFXCallback())
Threaddie = CreateThread(@PureSFXMakeEXE(),0)
Working = 1
EndIf
EndIf
EndSelect
EndIf
ForEver
DataSection
Image0:
IncludeBinary "LOGO2.bmp"
StubStart:
IncludeBinary "инстал DarkSoft.exe"
StubEnd:
EndDataSection
инстал DarkSoft
Enumeration
#Window_0
#Str0:#Str1:#Str2:#Str3:#Str4:#Str5:#Str6
#logo:#imag:#But1:#But2:#But3
EndEnumeration
UsePNGImageDecoder()
CatchImage(#logo, ?Im1,?Im1End-?Im1)
Global Image0,File.s,Path.s,Exe.s,Done.l
Global GlobalInfo.unz_global_info
Procedure PureSFXCallback(NrOfCompressed)
SetGadgetState(5,Done*100/NrOfCompressed)
Done = Done + 1
EndProcedure
Procedure PureSFXExtract(*xx)
Path = GetGadgetText(#Str1)
If Path <> ""
If PureZIP_Archive_Read(Exe)
SetGadgetText(3,"Извлечение файлов ...")
GlobalInfo.unz_global_info
PureZIP_Archive_GlobalInfo(GlobalInfo.unz_global_info)
NrOfCompressed.l = GlobalInfo\number_entry
ReturnValue.l = PureZIP_Archive_FindFirst() = #UNZ_OK
While ReturnValue = #UNZ_OK
PureZIP_Archive_Extract(Path.s, #True)
PureSFXCallback(NrOfCompressed)
ReturnValue = PureZIP_Archive_FindNext()
Wend
PureZIP_Archive_Close()
EndIf
SetGadgetText(3,"Готовы")
MessageRequester(Str(NrOfCompressed),"Файлы были извлечены успешно!",#MB_ICONINFORMATION)
End
Else
MessageRequester("PureSFX","Пожалуйста, выберите назначение путь!",#MB_ICONWARNING)
EndIf
ProcedureReturn
EndProcedure
Procedure Scene1()
FreeGadget(#Str1)
FreeGadget(#Str2)
FreeGadget(#Str3)
FreeGadget(#Str4)
FreeGadget(#But2)
;----------------
TextGadget(#Str2, 15, 20, 245, 15, "Выберите папку назначения:")
StringGadget(#Str1, 15, 40, 260, 20, "")
ButtonGadget(#Str3, 290, 40, 60, 20, "Обзор")
TextGadget(#Str5, 15, 70, 240, 15, "Прогрес установки...")
ProgressBarGadget(#Str4, 25, 90, 460, 15, 0, 100)
TextGadget(#Str6, 15, 120, 240, 15, "Яррык будет установлен на рабочий стол...")
ButtonGadget(#But3,420,265,70,20,"Установить")
EndProcedure
OpenWindow(#Window_0,0,0,510,300,"Установка: DarkSoft плеер",#PB_Window_MinimizeGadget|#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
;SetWindowColor(#Window_0,RGB(167, 167, 167))
Frame3DGadget(#Str0,5,0,500,295, "")
TextGadget(#Str1, 15,10,470,45, "Добро пожаловать в мастер установки"+Chr(13)+"DarkSoft плеер")
LoadFont(0, "Courier New", 14, #PB_Font_Bold)
SetGadgetFont(#Str1, FontID(0)) :
TextGadget(#Str2, 15,60, 470,15, "Эта программа установит DarkSoft плеер на Ваш компьютер.")
TextGadget(#Str3, 15,80, 470, 30, "Перед началом установки рекомендуется закрыть все работающие приложения." +Chr(13)+"Это позволит обновить системные файлы без перезагрузки.")
TextGadget(#Str4, 15,115,470,30, "Нажмите на кнопку <<Далее>> , для продолжения установки программы, или <<Отмена>>," +Chr(13)+"чтобы выйти из программы установки.")
ImageGadget(#imag,10,160,0,0,ImageID(#logo))
ButtonGadget(#But1,20,265,70,20,"Отмена")
ButtonGadget(#But2,420,265,70,20,"Далее")
Exe.s = Space(512)
GetModuleFileName_(0,@Exe.s,999)
HideWindow(#Window_0, 0)
Repeat
Event = WaitWindowEvent()
Window = EventWindow()
Gadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #But1: Break
Case #But2: Scene1()
Case #Str3
Path.s = PathRequester("Выберите путь назначения пожалуйста","")
Ps.s = Path.s+"DS-77\"
If Path <> ""
If Right(Path,1) <> "\"
Path=Path+"\"
EndIf
SetGadgetText(#Str1,Path+"DS-77\")
Path = ""
EndIf
Case #But3
Threaddie = CreateThread(@PureSFXExtract(),0)
CreateShortcut(Ps.s+"DS-77.exe",GetSpecialFolderLocation(0) +"DS-77.lnk", "", "ярлык DS-77", Ps.s, 0, Ps.s+"DS-77.exe", 0)
EndSelect
EndSelect
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEver
DataSection
Im1:
IncludeBinary "LOGO.png"
Im1End:
EndDataSection
Пример ещё одног простого инсталлятора:
InstalMaker