I am a n00b that needs help making apps portable and putting them in the Portableapps Platform. So far, I have (somehow) managed to successfully use the Portableapps.com Launcher and have tried to make it to the Portableapps.com Installer. I made an installer, and was very happy with myself, so I successfully installed it to the Platform. In my moment of pride, I tried to run the application and it gave me the following message:
F:\PortableApps\OverturePortable\App\Appinfo\Launcher\OverturePortable.ini is missing [Launch]:ProgramExecutable - What am I to launch?
Here is the OverturePortable.ini code:
;[MainLauncherWindow]
;@ = $DlgAttrBase sz(790,556) mg(0) alias(taskview) at(minimizable,customfooter) bg("MainWindowBg") onclose(if(env("WithoutSysShell"), if($IsKAT ? (if(isUserClose && uninstallAVPTool(msg("UninstallAVPToolWarning", #m_yesno|#m_warning)), url($url_trials)), true) : msg("ProductExitConfirm", #m_yesno), exit(), false))) h(16980)
;Header = [MainLauncherWindow.Header] subst(Title(text()) Administration(text()) )
;Body = [MainLauncherWindow.Body] a(la) sz(p,p) xy(,,,45)
;Footer = [MainWindow_Footer] sz(p,45) mg(20,,20) a(lb)
;AnimatedPage = t(animation) a(lt) sz(p,p)
[LauncherWindowPanel]
@ = a(lb) sz(p,$DialogPanelSizeY) rs(100,0) ext(1)
Background = sz(a,a) bg("DlgFooter") a(rt) extprm(1)
ResizeBackground = sz(p,p) rs(100,0) bg("DlgFooter_rs") a(pt) extprm(1)
Sep = $StdFooterSeparator a(lt) extprm(1)
Footer = [LauncherWindowFooter] sz(p,p)
[LauncherWindowFooter]
@ = a(lb) sz(p,40) rs(100,0) ext(1)
Cancel = [BtnGlass] a(rb) xy($Button_Shift,7) onclick(close()) extprm(1) text($Close)
Help = $FooterLink a(lc) xy(15,) onclick(help()) text($Help) extprm(1) enable($IsAdvancedDisinfectionStoped)
[LauncherWindowGreenFooter]
@ = a(lb) sz(p,40) rs(100,0) ext(1)
Bckgnd = sz(a,a) bg("DlgFooter") a(rt) extprm(1)
ResizeBackground = sz(p,p) rs(100,0) bg("DlgFooter_rs") a(pt) extprm(1)
Sep = $StdFooterSeparator a(lt) extprm(1)
FooterBody = [LauncherWindowFooter]
[MainLauncherWindow.Header]
@ = sz(p,57) ext(1)
Title = xy(18,9) sz(a,a) a(lt) bg("titlekts") at(clickable) onclick(window("ProductInfo")) extprm(1)
Settings = $HeaderLink subst(Icon(i("MainSettings"))) a(rt) xy(20,19,$Button_Shift) text($SettingsS) onclick(window("OptionsWindow"))
Administration = $HeaderLink subst(Icon(i("LauncherIcons16,2"))) a(pt) xy($Button_Shift,23) onclick(f_OpenWindowChecked("RemoteControlWindowPage",#pwdc_OpenConsole)) extprm(1) use(f_ManagementConsoleInstalled())
AlphaWarning = sz(a,a) a(ct) xy(,3) f("Header1White") use(!$IsRelease) text($AlphaWarning)
[MainLauncherWindow.Body]
Tools = [MainLauncherWindow.Tools] a(lb) sz(p,a) xy(11,,11)
Kis = [MainLauncherWindow.InternetSecurity] a(lt) xy(11)
Backup = [MainLauncherWindow.BackupBox] a(at) xy(6) use(f_isInstalled("BackupStorageMgr"))
BackupDisabled = [MainLauncherWindow.BackupBoxDisabled] a(at) xy(6) use(!ctl.Backup.visible)
Parctl = [MainLauncherWindow.Parctl] a(at) xy(6) use(f_isInstalled("PCtrlEx"))
ParctlDisabled = [MainLauncherWindow.ParctlDisabled] a(at) xy(6) use(!ctl.Parctl.visible)
[MainLauncherWindow.Box]
@ = sz(252,a) ext(1) at(clickable)
Header = a(lt) [MainLauncherWindow.Box.Header] extprm(1)
Body = a(la) sz(p,152) mg(9,10,9,10) bg(ctl.parent.hotlight ? "LauncherBodySel" : "LauncherBody") extprm(1)
Footer = [MainLauncherWindow.Box.Footer] extprm(1)
[MainLauncherWindow.DisabledBox]
@ = sz(252,a) ext(1)
Body = a(la) sz(p,152) xy(,29) mg(10,10,10,10) extprm(1)
Left = a(lt) sz(a,a) bg("LauncherDisabledLeft")
Middle = a(lt) sz(p,a) xy(5,,5) bg("LauncherDisabledMiddle")
Right = a(rt) sz(a,a) bg("LauncherDisabledRight")
[MainLauncherWindow.Box.Footer]
@ = a(la) sz(p,a) at(clickable) onclick(if(ctl.Menu.focused, ctl.focus(), ctl.Menu.focus())) ext(1)
Left = a(la) sz(a,a) bg("LauncherFooterLeft" + if(ctl.Menu.visible, "_Open"))
Middle = a(ls) sz(p,a) xy(4,,17) bg("LauncherFooterMiddle" + if(ctl.Menu.visible, "_Open"))
Right = a(rs) sz(a,a) bg("LauncherFooterRight" + if(ctl.Menu.visible, "_Open"))
Menu = [MainLauncherWindow.Box.Menu] a(la) extprm(1)
Label = a(lt) xy(10,5) f("Normal9") extprm(1)
[MainLauncherWindow.Box.Menu]
@ = sz(p,a) at(clickable) bp(ctl.visible = ctl.focused) ext(1)
Bg = a(lt) sz(p,p) xy(,,,11) bg("LauncherFooterMenuBody")
Body = a(lt) xy(,7) sz(p,a) mg(2,0,2) extprm(1)
Left = a(la) sz(a,a) bg("LauncherFooterMenuLeft")
Middle = a(ls) sz(p,a) xy(4,,4) bg("LauncherFooterMenuMiddle")
Right = a(rs) sz(a,a) bg("LauncherFooterMenuRight")
[MainLauncherWindow.Box.Menu.Link]
@ = a(la) sz(p,a) mg(8,5,8,5) bg(ctl.hotlight ? "LauncherFooterMenuSel" : "") at(clickable) ext(1)
Icon = a(lt) extprm(1)
Link = a(at) f("Normal9") extprm(1)
[MainLauncherWindow.Box.Header]
@ = a(lt) sz(p,a) ext(1)
Dummy = a(lt) sz(p,29)
BgRed = a(lt) [MainLauncherWindow.Box.Header.BgRed] use(0) extprm(1)
BgGreen = a(lt) [MainLauncherWindow.Box.Header.BgGreen] use(1) extprm(1)
BgYellow = a(lt) [MainLauncherWindow.Box.Header.BgYellow] use(0) extprm(1)
Title = a(lc) sz(p,a) at(singleline) xy(10) f("Description") extprm(1)
[MainLauncherWindow.Box.Header.BgRed]
@ = sz(p,29) ext(1)
Left = a(lt) sz(5,a) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderRedLeftSel" : "LauncherHeaderRedLeft") extprm(1)
Middle = a(lt) sz(p,a) xy(5,,5) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderRedMiddleSel" : "LauncherHeaderRedMiddle") extprm(1)
Right = a(rt) sz(5,a) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderRedRightSel" : "LauncherHeaderRedRight") extprm(1)
[MainLauncherWindow.Box.Header.BgGreen]
@ = sz(p,29) ext(1)
Left = a(lt) sz(5,a) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderGreenLeftSel" : "LauncherHeaderGreenLeft") extprm(1)
Middle = a(lt) sz(p,a) xy(5,,5) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderGreenMiddleSel" : "LauncherHeaderGreenMiddle") extprm(1)
Right = a(rt) sz(5,a) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderGreenRightSel" : "LauncherHeaderGreenRight") extprm(1)
[MainLauncherWindow.Box.Header.BgYellow]
@ = sz(p,29) ext(1)
Left = a(lt) sz(5,a) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderYellowLeftSel" : "LauncherHeaderYellowLeft") extprm(1)
Middle = a(lt) sz(p,a) xy(5,,5) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderYellowMiddleSel" : "LauncherHeaderYellowMiddle") extprm(1)
Right = a(rt) sz(5,a) bg(ctl.parent.parent.parent.hotlight ? "LauncherHeaderYellowRightSel" : "LauncherHeaderYellowRight") extprm(1)
[MainLauncherWindow.InternetSecurity]
@ = [MainLauncherWindow.Box] alias(productstatus) subst(Footer(subst(Label() Menu(subst(Body([MainLauncherWindow.Box.Menu.InternetSecurity]))))) Body([MainLauncherWindow.InternetSecurity.Body]) Header(subst(BgRed(use(1) visible(s_ProdStateSeverity(ProdStateId)==#eProtStateCrit)) BgYellow(use(1) visible(s_ProdStateSeverity(ProdStateId)==#eProtStateWarn)) BgGreen(visible(s_ProdStateSeverity(ProdStateId)==#eProtStateNormal)) Title(text(s_ProtectionBannerText(s_ProdStateSeverity(ProdStateId))))))) onclick(ctl.AnimatedPage.createItems("MainWindowPage",ctl,300)) prm(s_ProductStateList)
[MainLauncherWindow.Box.Menu.InternetSecurity]
$OpenScanProgressWindow = window("ScanProgressWindow", p_itemID(name), $ModalIfRemote)
Protection = [MainLauncherWindow.Box.Menu.Link] subst(Icon(xy(2) i(s_IsStateRunning(Protection.state) ? "ParCtlOptionsIcon,4" : "ParCtlOptionsIcon,6")) Link()) onclick(f_setState(s_IsStateRunning(Protection.state) ? #TASK_REQUEST_PAUSE : #TASK_REQUEST_RUN, "Protection"); ctl.parent.focus()) use(!$IsProtectionNotInstalled)
Full = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("LauncherIcons16,1")) Link()) alias(taskview) ns(Scan_My_Computer) onclick(f_setState(#TASK_REQUEST_RUN, name); $OpenScanProgressWindow)
Update = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("ParCtlExAll16,0")) Link()) alias(taskview) ns(Updater) onclick(f_setState(#TASK_REQUEST_RUN, name); $OpenUpdaterProgressWindow)
[MainLauncherWindow.InternetSecurity.Body]
@ = a(la)
Icon = sz(a,a) a(lt) i("TaskKAV")
Descr = a(as) f("Header5Med")
Security = a(lt) xy(,75) f("Description") text(s_ProtectionBannerText(s_ProdStateSeverity(ProdStateId)) + ": " + s_ProdState_Threats(ProdStateId))
Bases = a(la) xy(,5) f("Header0")
Status = a(as) f("Description") text(f_BasesStatus(product.UpdateState))
[MainLauncherWindow.Box.Menu.Backup]
;Backup = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("BackupIcons,1")) Link()) onclick(f_OpenWindowChecked("BackupMainWindowPage:Backup",#pwdc_OpenBackup))
Backup = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("BackupIcons,1")) Link()) onclick(f_OpenWindowChecked("BackupMainWindowPage",#pwdc_OpenBackup))
;Restore = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("BackupIcons,0")) Link()) onclick(f_OpenWindowChecked("BackupMainWindowPage:Restore",#pwdc_OpenBackup))
Restore = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("BackupIcons,0")) Link()) onclick(f_OpenWindowChecked("BackupMainWindowPage",#pwdc_OpenBackup))
Report = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("report16")) Link()) onclick(window("BackupStatistics"))
[MainLauncherWindow.BackupBox]
@ = [MainLauncherWindow.Box] alias(last_backup_task) subst(Footer(subst(Label() Menu(subst(Body([MainLauncherWindow.Box.Menu.Backup]))))) Body([MainLauncherWindow.Backup.Body]) Header(subst(BgRed(use(1) visible(UpdateState & #eBackupTaskFailed)) BgYellow(use(1) visible(UpdateState & (#eBackupTaskNotFinished|#eBackupNoTasks)) ) BgGreen(use(1) visible(f_BackupStateOk())) Title()))) onclick(ctl.AnimatedPage.createItems("BackupMainWindowPage",ctl,300,0))
[MainLauncherWindow.BackupBoxDisabled]
@ = [MainLauncherWindow.DisabledBox] subst(Body([MainLauncherWindow.Backup.Body] subst(DateText(use(0)) Date(use(0)) StatusText(use(0)) Status(use(0)) Error(use(0)))))
[MainLauncherWindow.Backup.Body]
@ = a(la) ext(1)
Icon = sz(a,a) a(lt) i("backup48")
Descr = a(as) xy(,,,15) f("Header5Med")
dummy = a(lt) xy(,70) sz(0,0)
DateText = a(la) xy(,5) f("Description") visible(state) extprm(1)
Date = a(la) f("Description") sz(p,a) text(capitalize(s_ProfileStateRes(state,false))) ontimer(10000,ctl.updatedata()) visible(state) extprm(1)
StatusText = a(la) xy(,5) f("Header0") extprm(1)
Error = a(as) f("Description") sz(p,a) visible(lastErr) extprm(1)
NoTasks = a(as) f("Description") sz(p,a) visible(!lastErr && !state)
Status = a(as) f("Description") sz(p,a) visible(!lastErr && state) text(capitalize(s_ProfileState(state,false,true))) extprm(1)
[MainLauncherWindow.Box.Menu.Parctl]
Suspend = [MainLauncherWindow.Box.Menu.Link] subst(Icon(xy(2) i(state == #StateRunning ? "ParCtlOptionsIcon,4" : "ParCtlOptionsIcon,6")) Link()) onclick(if(state == #StateRunning,if(checkPassword(#pwdc_OpenParctl),setstate(#TASK_REQUEST_PAUSE,name)),setstate(#TASK_REQUEST_RUN,name)); ctl.parent.focus())
;Reports = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("ParCtlStat16")) Link()) onclick(f_OpenWindowChecked("ParCtlMainWindowPage:Stat",#pwdc_OpenParctl))
Reports = [MainLauncherWindow.Box.Menu.Link] subst(Icon(i("ParCtlStat16")) Link()) onclick(f_OpenWindowChecked("ParCtlMainWindowPage",#pwdc_OpenParctl))
;Settings = [MainLauncherWindow.Box.Menu.Link] subst(Icon(xy(2) i("ParCtlOptionsIcon,0")) Link()) onclick(f_OpenWindowChecked("ParCtlMainWindowPage:Users",#pwdc_OpenParctl))
Settings = [MainLauncherWindow.Box.Menu.Link] subst(Icon(xy(2) i("ParCtlOptionsIcon,0")) Link()) onclick(f_OpenWindowChecked("ParCtlMainWindowPage",#pwdc_OpenParctl))
[MainLauncherWindow.Parctl]
@ = [MainLauncherWindow.Box] subst(Footer(subst(Label() Menu(subst(Body([MainLauncherWindow.Box.Menu.Parctl]))))) Body([MainLauncherWindow.Parctl.Body]) Header(subst(Title() BgRed(use(1) visible(state != #StateRunning)) BgGreen(visible(state == #StateRunning))))) alias(taskview) ns(PCtrlEx) onclick(ctl.AnimatedPage.createItems("ParCtlMainWindowPage",ctl,300))
[MainLauncherWindow.ParctlDisabled]
@ = [MainLauncherWindow.DisabledBox] subst(Body([MainLauncherWindow.Parctl.Body]))
[MainLauncherWindow.Parctl.Body]
@ = a(la) ontimer(1000,l_AccountControlSettings=findSettingsUserAccount(ser(users),CurrentUserSID).settings)
Icon = sz(a,a) a(lt) i("parctl48")
Descr = a(as) f("Header5Med")
dummy = a(lt) xy(,70) sz(0,0)
UsersText = a(la) xy(,5) f("Description") visible(!f_IsStateActive(state) || !l_AccountControlSettings.Enabled)
Users = a(as) f("Description") sz(p,a) visible(!f_IsStateActive(state) || !l_AccountControlSettings.Enabled) text(f_IsStateActive(state) ? controlledUsersCount(ser(users)) : 0)
Status = [MainLauncherWindow.Parctl.Body.Status] xy(,5) visible(f_IsStateActive(state) && l_AccountControlSettings.Enabled)
[MainLauncherWindow.Parctl.Body.Status]
@ = a(la) sz(p,a)
StatusText = a(la) f("Header0")
Dummy = a(as) sz(0,0) xy(,-14)
Internet = a(ss) visible(l_AccountControlSettings.InternetControl.Enabled || l_AccountControlSettings.FileDownloadControl.Enabled || l_AccountControlSettings.WebControl.Enabled || l_AccountControlSettings.SafeSearch.Enabled) f("Description") sz(a,a) xy(,14)
IM = a(ss) visible(l_AccountControlSettings.IMControl.Enabled || l_AccountControlSettings.Keywords.Enabled || l_AccountControlSettings.PersonalInfo.Enabled) f("Description") sz(a,a) xy(,14)
Computer = a(ss) visible(l_AccountControlSettings.ComputerControl.Enabled || l_AccountControlSettings.AppControl.Enabled) f("Description") sz(a,a) xy(,14)
Empty = a(ss) visible(!ctl.Internet.visible && !ctl.IM.visible && !ctl.Computer.visible) sz(a,a) f("Description") xy(,14)
[MainLauncherWindow.Tools]
Top = [MainLauncherWindow.Tools_Top] a(lt) sz(p,a)
Bottom = [MainLauncherWindow.Tools_Bottom] a(la) sz(p,a)
[MainLauncherWindow.Tools_Top]
Bg_MT = a(lt) sz(p,a) bg("LauncherHeaderGreenMiddle") xy(5,,5)
Bg_LT = a(lt) sz(a,a) bg("LauncherHeaderGreenLeft")
Bg_RT = a(rt) sz(a,a) bg("LauncherHeaderGreenRight")
Title = a(lc) f("Header3") xy(20,-1)
[MainLauncherWindow.Tools_Bottom]
Bg_MT = a(lt) sz(p,a) bg("LauncherToolsMB") xy(5,,5)
Bg_LT = a(lt) sz(a,a) bg("LauncherToolsLB")
Bg_RT = a(rt) sz(a,a) bg("LauncherToolsRB")
Body = [MainLauncherWindow.Tools.Body]
[MainLauncherWindow.Tools.Body]
@ = sz(p,p) mg(20,20)
Tuneup = a(as) xy(,,10) [MainLauncherWindow.Task] subst(Name(text()) Descr(text()) Icon(i("pctuneup48"))) onclick(ctl.AnimatedPage.createItems("TuneUpWindowPage",ctl,300))) use(f_TuneUpInstalled())
Encryption = a(as) [MainLauncherWindow.Task] subst(Name(text()) Descr(text()) Icon(i("encryption48"))) onclick(ctl.AnimatedPage.createItems("EncryptionWindowPage",ctl,300)) use(f_EncryptionInstalled())
Offset2 = a(la) xy(,20) use(ctl.Encryption.visible || ctl.Tuneup.visible)
Keyboard = a(as) xy(,,10) [MainLauncherWindow.Task] subst(Name(text()) Descr(text()) Icon(i("vkbd48"))) onclick(window("VirtualKeyboard")) use(f_isVkbdInstalled())
Password = a(as) [MainLauncherWindow.Task] subst(Name(text()) Descr(text()) Icon(i("passwordmgr48")) State([MainLauncherWindow.Tool.Password.State])) onclick(openStickyPassword()) use(f_PassMgrInstalled())
[MainLauncherWindow.Tool.Password.State]
@ = xy(12,2) ontimer(1000, ctl.updatedata())
NotStarted = a(lt) f("KtsDescriptionDGrey") visible(spStatus() == #PassMgrDown)
Locked = a(lt) f("KtsDescriptionRed") visible(spStatus() == #PassMgrLocked)
Unlocked = a(lt) f("KtsDescriptionGreen") visible(spStatus() == #PassMgrUnlocked)
[MainLauncherWindow.Task]
@ = sz(360,a) at(clickable) mg(10,7,10,10) bg1(ctl.selected ? "HilightBtn_sel" : (ctl.hotlight ? "HilightBtn" : "")) ext(1)
Icon = a(lt) extprm(1)
Name = a(lt) xy(53) f("Header2") sz(a,a) extprm(1)
State = a(as) extprm(1)
Descr = a(la) xy(53,8) f("Description") sz(p,a) extprm(1)
Again, I am a n00b with Portableapps Development and even worse at programming, so if anyone can solve this problem, please edit the code above to include this apparently missing line of code so it can work properly. Hopefully, once this problem is solved, my app will work and I can use this launcher.ini for more apps in the future. If you know the answer to this problem, please hurry in getting the solution to me
P.S. If you have any advice on making apps portable, feel free to share it with me as it would be extremely useful to me
That information you attached is completely unrelated to a PA.c Launcher INI. By unrelated, I mean none of what you posted has anything to do with the PA.c Launcher, not a single section is used by it. Details on the actual INI format are here: https://portableapps.com/manuals/PortableApps.comLauncher/
You can find examples of basic INIs in most of our apps. Things like AkelPad or AIMP.
Sometimes, the impossible can become possible, if you're awesome!
I very much appreciate your help, this helps me a ton, but I have a couple of questions about this new .ini
1: Since the one I previously posted was wrong, does this mean I have to make a new .ini for it? (I expect so)
2: This app I am trying to make portable is a simple .exe that uses a local storage system that is set up the first time you run it on a computer (it's kind of weird). I looked at multiple portable apps, including the ones you mentioned, and found that they were too complicated for this lonely .exe. As I have said before, I am very new to programming, so I need some kind of template to begin this file, and this template has to be the simplest one available, so do you know of any simple apps on this site that don't have internal directories or anything, pretty much just an exe with the portableapps.com req.?
Thank you so much for the help!
You haven't made an INI for the PA.c Launcher at all yet. What you posted has nothing at all to do with PA.c Launcher. It's a random INI from something else. INI files are configuration files. They're not interchangeable.
Sometimes, the impossible can become possible, if you're awesome!
So how would I go about making one? I tried reading that manual that you linked me to and didn't understand a word of it.
Our official catalog has apps with a lot of different portability requirements you can look at to get an idea.
Start out with something very basic, and look at the docs John linked you to while you are checking them out. This will give you a good basis for the bare requirements before moving on to the more advanced topics. I've listed some apps below with what each can teach you (disclaimer: all are apps I have had released, just because I know them better to tell you what you can learn from them).
dotNETInspector is quite basic, and a good place to start. The app itself is innately portable, all the PortableApps Launcher does is run the executable with a specific command line parameter (the path to the default export directory), then close. It doesn't even wait to clean up after the base app exits because there is nothing to clean up.
Then move on to other apps:
One of the last things to learn (which you may or may not care about) is language switching. This is usually very different for each app. If/when you do get to this stage, we can help you further.