Просмотров: 2907 | Дата: 24.04.2024 | Коментарии (0)

Инсталлятор на 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











Сайт посвящён языку программирования PureBasic — коммерческий компилятор языка программирования, использующего синтаксис BASIC. Предназначен для создания кроссплатформенных приложений для AmigaOS, Linux, Microsoft Windows, Windows NT и Mac OS X. Разработан компанией Fantaisie Software.