Upcoming Events
Quick Stats
4919 people currently visiting GDNet.
2395 articles in the reference section.

Help us fight cancer!
Join SETI Team GDNet!
Link to us Events 4 Gamers
Home » Features » Product Reviews » QSetup
Intel sponsors gamedev.net search:

Product Reviews
Jump to:
Software
All product reviews

Product: QSetup
Developer: Pantaray
Reviewer: John Hattan
Posted: September 21, 2007
Rating:
Discuss this review

QSetup 8
by John Hattan

Introduction

The life of a setup-program maker can't be easy nowadays. What with the included-with-Windows MSI installer, the entrenched market-leader InstallShield, and the quality free offerings out there like NSIS, coming out with a new install-making utility seems roughly equivalent to coming out with a new word processor. While it's certainly do-able, you're going to have to overcome a lot of market inertia or at least bring enough new to the table to distinguish yourself.

Or perhaps you can just do the job well and be easy to use. Must you build a better mousetrap, or is it just enough to make a high quality mousetrap that's easy to use? If your goal is not to have the world beat a path to your door but just to sell some mousetraps, having a good mousetrap might be enough.

QSetup seems to be setting itself up as a good compromise between features and ease of use. Actually I'd go a bit further and say that QSetup does an excellent job of being easy to use without sacrificing features. QSetup has a lot of features that you'd expect to see in the "big boy" installers, like split stub/downloaded installs and automatic updates, but it's so easy to use that you can slap together a quick install in just a couple of minutes.

QSetup In Action

Here's the sum-total of the QSetup interface. Everything's done from here. . .


(click for full-size)

Actually what you're seeing is 1/16 of the QSetup interface. Each of those buttons in the large pane on the right opens up a new page of the install you're building. The first page you see is the "Project" page. The blue rectangles along the top tell you what tab is open as well as a quick summary of what you're seeing. In this case, we're looking at the main settings for the project. This is the place where you set up your new project as well as the settings that affect the entire installer.

The pages are actually fairly well organized. If you want, you can just press all 16 buttons top-to-bottom (well 15 if you want to skip "about"), change the default settings to the ones that affect your software, press "compile" to create your setup program, and you're done. For the sake of this review, I'm going to rewrite the installer that I currently use for my Bulldozer game. I currently use a setup.exe built with NSIS. It's not the most comprehensive thing to install (just a couple of EXE files), but it does show off all the end-to-end features of an installer and uninstaller. The screen shown above contains the project defaults for my Bulldozer installer re-done with QSetup

One interesting feature is the "Create Split Setup" section. If you enable this, QSetup will break your installer into two pieces, a small (175k) stub and a larger archive containing the rest of your installer. The stub has the URL of the rest of the installer hard-coded into it, so a user installing your program would just download the small setup.exe file and the rest would be auto-downloaded and installed on the fly. The first place I saw this was with the Java installer, but I'm seeing this feature more and more nowadays. This can see this being a particularly nice feature if you have some cheap bandwidth file-storage somewhere on the internet. You could conceivably save on some bandwidth by just providing folks with your small installer that covertly grabs the rest of itself as it installs.

Defining The Files

Apart from setting up the initial project, the most important part of making an installer are the files to install, so here's the window for that.

One thing I noticed immediately about QSetup is that it's important to do things in order, mainly because it makes things a lot more convenient by pre-filling in stuff later. For example, the "Target Executable" box pre-fills the "Shortcuts" tab with your executable path and icon, so if you do things in order, you'll find a lot of stuff is already filled out by the time you get to it.

The predefined folders at the top are mainly for convenience' sake. You can define your own custom folders if your install is more complex than the simple one shown here. You can also create "groups" that you can tag if you need to build a "minimal/full/custom" installer where the user can choose how much of the program to install.

There are several attributes you can apply to each file. You can set certain files to only be installed for certain OS's. Here you can also exclude files from uninstall.

The Dialogs and the Setup Sequence

After setting up the files to be installed as well as folders and full/minimal/custom attributes and such, the next important page is the "Dialogs" page. This page name is a bit of a misnomer, because in addition to setting up the dialogs, you use this page to set up the entire sequence for the installer.

The check-able list on the left is the list of common dialogs that your install program will display. Nothing all that surprising here -- Welcome, License, Destination Folder, etc. If you want a dialog to be part of the install, check it and it'll display. If you want to change the sequence of things, you can just drag the items around to change the sequence.

QSetup also supports custom dialog boxes in case the predefined ones don't do quite enough. Just as an example, let's make a box to enter your product's serial number and let's do it Microsoft-style. While the predefined "User Information" dialog allows you to enter (and validate via a hard-coded list or a custom validation DLL) a serial number for the product, let's suppose that we want to break up things into separate fields. Here's my custom dialog.


If you're familiar with VB, the dialog editor will be pretty familiar. You've got all the standard controls, and you can set all of the properties for 'em with the little mini-spreadsheet next to the box. The only thing that's un-VB-ish is how you actually attach code to the dialog. If you look at the properties, you'll see an on-property (in this case, onClick). You can attach code to this action in the Execute page, which will be discussed in a bit.

As you can see by now, there's a lot under the hood of QSetup. We've only covered three of the 16 pages available, and we've already seen about a hundred options that you can set. Thankfully the vast bulk of these options are either pre-set for you or can be ignored unless your install is doing something particularly unconventional. In the case of the "switches" page, for example. . .

The only option I had to set was to shut off support for Windows 95 (because my game only runs on Win 98 and later).

While we're on this page, note that QSetup supports detection and installation of the .NET framework.

Even though we're only about 1/3 of the way through the pages, my setup program is pretty-much done. I can now press the "Compile" button and it'll compress up a standalone EXE setup program for me. Anything from now on (at least for me) is just some window-dressing. For example, let's check out what shortcuts are pre-filled.

The default executable is pre-filled for me with the game's name and icon. If I wanted to give the user the option of more places to put shortcuts (like the Windows desktop or Quick Launch bar), then I can set that here. This is also the place to define more shortcuts if you want to link to your documentation or your webpage's url or stuff like that.

The next few pages allow you to add custom registry entries, INI-files (does anyone use those anymore?), Environment variables, or file associations. They're pretty straightforward. Note that any custom folder-names you used in the "Files" page can be used here. For example, if you need to store a path to something in the install folder in the registry somewhere, you have access to the "" variable that'll be preset with your installation folder.

Execution Items

Now then, let's cover the "Execute" page, which I mentioned earlier is the place where you can add code to the events in your dialogs. In truth you can add events to just about anything via this page. You can have things happen before or after dialogs, before or after installs, or just about anywhere else. If you need a little (and I do mean a little) scripting in your install to handle something custom, then this is the place. Here's a simple Execution Item.

This Execution Item runs at the start of setup (before any dialogs appear) and warns the user if his screen resolution is set to below 1024x768. There are loads of system parameters you can check with Execution Items, ranging from versions of runtime stuff (.NET framework, Flash player, Java, etc) as well as predefined registry keys or system parameters (memory, color depth, etc).

Now then, back to my little Microsoft-style serial-number-enterer. Here's an event that's triggered upon entering some text in one of the fields. . .

It's a mite odd, but if you stare at it long enough you'll see that I added an conditional item called "checkthings". This item will check the text in the field "Edit1" of my dialog, and if it's set to "test", then it'll set the text of "Edit2" to "1234".

Yeah, it's a pretty useless bit of code, but it does show off how scripting is done in QSetup. In addition to conditional statements, you have unconditional statements and while-loops. Note, though, that you're pretty-much limited to what's in this dialog box. And that's limited to. . .

if (up to three conditions)
// perform up to three actions
else
// perform up to three actions

While this construct will probably take care of simple scripting, you can certainly hit some roadblocks. For example, one thing I tried to do with my little custom serial-number dialog box was to automatically move to the next field once an existing field is full of five characters. Unfortunately the Execute Item dialog didn't have a property for a field's length, just its contents.

All is not lost, though. As detailed in the appendix of QSetup's manual, you can script your event triggers with a DLL, so if you do need some more sophisticated handling than is provided by default, you can write it yourself.

Auto Update

One high-end feature of QSetup (included in the Pro version) is an Auto Update feature. This is a small executable program that you can install along with your project. If the user invokes the Auto Update program (presumably via the Start menu), it'll check the version number (see the Project page) of your setup program on the internet. If the internet version is later than the one installed, it'll (optionally) shut down your program, download the update, install the new version, and (optionally) start your program back up.

Honestly, this is a pretty nice feature as internet updates are usually something you need to either write yourself or buy separately. Even though it's only included with the Pro version, it's probably worth the price. It makes the whole auto-update sequence a no-brainer. You can even set up the location to upload your setup.exe file (via FTP) so you can upload your new version setup.exe and have your users' start updating themselves immediately.

Uninstall

The uninstaller is built from the settings that you've set along the way, so the files you copy and the registry values you create and any other changes you make along the way are automatically unrolled. Note that anything you do set in your install program, be it copying a file or creating a registry key or anything else, has a "do not uninstall this" option available. So if, for example, you don't want to remove a user's settings or high scores, you can choose to have the uninstaller leave 'em there.

The uninstaller also has the option available to perform a "silent uninstall" if you just want your app to quietly disappear if someone chooses to uninstall. Silent-mode is available for both install and uninstall via the /SILENT and /HIDE command-line switches, which is frightfully useful if you're doing a mass-install or uninstall on a network of machines.

Unfortunately I did run into a roadblock with the uninstall feature. My game creates a little database file in the standard location for the user's file-space. This file contains the standard settings you'd expect, like your progress, volume level, etc., and I'd like to remove that file upon uninstall. After wrestling with the file dialog a bit and an email to tech support, I found that this operation was easier said than done. While it would be easy to set up an item that would remove the entire "c:\documents & settings\your name\application data\the code zone" folder and all its contents, I can't do that because there might be files from my other games in there. My only other solution was to create an execution item that manually removes that file. Unfortunately that's not necessarily a very good solution either because the only times that execution items can be triggered at uninstall is immediately before or after the uninstall happens. And I don't want a situation where the user decides to cancel the uninstall before it happens only to find that his config-file is wiped out anyway, and it was a bit ambiguous as to exactly when execution items happen at uninstall-time.

The other solution would've been for my program to keep settings in their own folders, like "application data\the code zone\bulldozer" so I could wipe out that folder without worrying about getting rid of other stuff you want to keep. Unfortunately the app's already been in the wild for quite some time, so making people move their config files if they want the next minor update.

Or I could just leave the config file there. While some systems (specifically Mac) no longer consider it rude for your app to leave its settings behind upon uninstall, I really prefer that my uninstall leave your machine in exactly the same condition that it found it.

Thankfully, though, tech support let me know that the trigger happens after the uninstall dialog appears, so it wouldn't accidentally delete something if the user decided to cancel. The tech support was quick and helpful. And, given that install programs are generally written in a hurry three hours before your product ships, this is a considerable advantage over solutions like NSIS where you're pretty-much at the mercy of the folks on the support forum.

Conclusion

QSetup is a very well thought-out installer, and it distinguishes itself from the competition by giving you some high-end features (like split installs and auto-update) for a pretty reasonable price ($150 to $450 for single-user, $1499 for a site). There's a feature-comparison chat here so you can figure out "how much" QSetup will suit your needs.

They have a free demo version on the site that has all the program's features (demo installs are branded and only work for five days) so you can see if QSetup will suit your needs without having to spend any money. In fact, you can build your entire install with the demo-version, then buy the retail version only when you're 100% certain that it'll suit your needs. And that's pretty nice.

One interesting feature they have for the top-tier "PLUS" version is that it includes development of one complete setup solution for you. You give 'em a detailed description of how your software install is supposed to look and act, and they'll put together a setup for you that does it. Seems like this would be handy if your development team is in a hurry to get your product out the door and you've got enough money to skip the learning curve entirely.

QSetup is a nice piece of software, and it manages to do with a simple straightforward interface what other installers can only do with a script-only environment (MSI, NSIS) or with scripting coupled with a mind-numbingly complex interface (InstallShield). As far as learning curve goes, QSetup is about the simplest non-trivial installer I've seen.