+ return PropertySheetFuncCommon(hwnd, message, wParam, lParam, PSWIZB_BACK|PSWIZB_NEXT);
+}
+
+static HRESULT (WINAPI *f_SHGetSpecialFolderPath)(HWND hwnd, LPTSTR lpszPath, int nFolder, BOOL fCreate);
+
+BOOL CALLBACK PropertySheetFunc4(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
+ if(message == WM_INITDIALOG) {
+ pdf2swf_path = concatPaths(install_path, "pdf2swf_gui.exe");
+ FILE*fi = fopen(pdf2swf_path, "rb");
+ if(fi) {
+ printf("a GUI program exists, creating desktop/startmenu links\n");
+ config_createLinks = 1;
+ fclose(fi);
+ }
+ if(!config_createLinks) {
+ SendDlgItemMessage(hwnd, IDC_STARTMENU, SW_HIDE, 0, 0);
+ SendDlgItemMessage(hwnd, IDC_DESKTOP, SW_HIDE, 0, 0);
+ }
+
+ SendDlgItemMessage(hwnd, IDC_STARTMENU, BM_SETCHECK, config_createStartmenu, 0);
+ SendDlgItemMessage(hwnd, IDC_DESKTOP, BM_SETCHECK, config_createStartmenu, 0);
+ }
+ if(message == WM_COMMAND) {
+ if((wParam&0xffff) == IDC_STARTMENU) {
+ config_createStartmenu = SendDlgItemMessage(hwnd, IDC_STARTMENU, BM_GETCHECK, 0, 0);
+ config_createStartmenu^=1;
+ SendDlgItemMessage(hwnd, IDC_STARTMENU, BM_SETCHECK, config_createStartmenu, 0);
+ return 0;
+ }
+ if((wParam&0xffff) == IDC_DESKTOP) {
+ config_createDesktop = SendDlgItemMessage(hwnd, IDC_DESKTOP, BM_GETCHECK, 0, 0);
+ config_createDesktop^=1;
+ SendDlgItemMessage(hwnd, IDC_DESKTOP, BM_SETCHECK, config_createDesktop, 0);
+ return 0;
+ }
+ }
+
+ if(message == WM_NOTIFY && (((LPNMHDR)lParam)->code == PSN_WIZFINISH)) {
+ if(!addRegistryEntries(install_path)) {
+ MessageBox(0, "Couldn't create Registry Entries", "SWFTools Install", MB_OK|MB_ICONERROR);
+ return 1;
+ }
+
+ char mypath[MAX_PATH];
+ path_startmenu[0] = 0;
+ path_desktop[0] = 0;
+ if(config_forAllUsers) {
+ f_SHGetSpecialFolderPath(NULL, path_desktop, CSIDL_COMMON_DESKTOPDIRECTORY, 0);
+ f_SHGetSpecialFolderPath(NULL, path_startmenu, CSIDL_COMMON_PROGRAMS, 0);
+ }
+ /* get local program/desktop directory- this is both for forAllUsers=0 as well
+ as a fallback if the above didn't return any paths */
+ if(!path_startmenu[0]) {
+ f_SHGetSpecialFolderPath(NULL, path_startmenu, CSIDL_PROGRAMS, 0);
+ }
+ if(!path_desktop[0]) {
+ f_SHGetSpecialFolderPath(NULL, path_desktop, CSIDL_DESKTOPDIRECTORY, 0);
+ }
+
+ if(config_createLinks) {
+ if(config_createDesktop && path_desktop[0]) {
+ char* linkName = concatPaths(path_desktop, "pdf2swf.lnk");
+ printf("Creating desktop link %s -> %s\n", linkName, pdf2swf_path);
+ if(!CreateShortcut(pdf2swf_path, "pdf2swf", linkName, 0, 0, 0, install_path)) {
+ MessageBox(0, "Couldn't create desktop shortcut", "Install.exe", MB_OK);
+ return 1;
+ }
+ }
+ if(config_createStartmenu && path_startmenu[0]) {
+ char* group = concatPaths(path_startmenu, "pdf2swf");
+ CreateDirectory(group, 0);
+ char* linkName = concatPaths(group, "pdf2swf.lnk");
+ printf("Creating %s -> %s\n", linkName, pdf2swf_path);
+ if(!CreateShortcut(pdf2swf_path, "pdf2swf", linkName, 0, 0, 0, install_path)) {
+ MessageBox(0, "Couldn't create start menu entry", "Install.exe", MB_OK);
+ return 1;
+ }
+ }
+ } else {
+ printf("not creating desktop/startmenu links\n");
+ }
+ }
+ return PropertySheetFuncCommon(hwnd, message, wParam, lParam, PSWIZB_FINISH);
+}
+
+#ifndef PSP_HIDEHEADER
+#define PSP_HIDEHEADER 2048
+#endif
+
+typedef struct _wizardpage {
+ DLGPROC function;
+ int resource;
+} wizardpage_t;
+
+void runPropertySheet(HWND parent)
+{
+ PROPSHEETHEADER sheet;
+
+ wizardpage_t wpage[5] = {
+ {PropertySheetFunc1, IDD_LICENSE},
+ {PropertySheetFunc2, IDD_INSTALLDIR},
+ {PropertySheetFunc3, IDD_PROGRESS},
+ {PropertySheetFunc4, IDD_FINISH},
+ };
+ int num = sizeof(wpage)/sizeof(wpage[0]);
+ HPROPSHEETPAGE pages[num];
+ int t;
+ for(t=0;t<num;t++) {
+ PROPSHEETPAGE page;
+ memset(&page, 0, sizeof(PROPSHEETPAGE));
+ page.dwSize = sizeof(PROPSHEETPAGE);
+ page.dwFlags = PSP_DEFAULT|PSP_HIDEHEADER;
+ page.hInstance = me;
+ page.pfnDlgProc = wpage[t].function;
+ page.pszTemplate = MAKEINTRESOURCE(wpage[t].resource);
+ pages[t] = CreatePropertySheetPage(&page);
+ }
+
+ memset(&sheet, 0, sizeof(PROPSHEETHEADER));
+ sheet.dwSize = sizeof(PROPSHEETHEADER);
+ sheet.hInstance = me;
+ sheet.hwndParent = parent;
+ sheet.phpage = pages;
+ sheet.dwFlags = PSH_WIZARD;
+ sheet.nPages = num;
+ PropertySheet(&sheet);
+}
+
+int WINAPI WinMain(HINSTANCE _me,HINSTANCE hPrevInst,LPSTR lpszArgs, int nWinMode)
+{
+ me = _me;
+ WNDCLASSEX wcl_background;
+ wcl_background.hInstance = me;
+ wcl_background.lpfnWndProc = WindowFunc;
+ wcl_background.lpszClassName= "SWFTools Install";
+ wcl_background.style = CS_HREDRAW | CS_VREDRAW;
+ wcl_background.hIcon = LoadIcon(NULL, IDI_APPLICATION);
+ wcl_background.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
+ wcl_background.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcl_background.lpszMenuName = NULL; //no menu
+ wcl_background.cbClsExtra = 0;
+ wcl_background.cbWndExtra = 0;
+ wcl_background.hbrBackground= CreateSolidBrush(RGB(0, 0, 128));
+ wcl_background.cbSize = sizeof(WNDCLASSEX);
+
+ HINSTANCE shell32 = LoadLibrary("shell32.dll");
+ if(!shell32) {
+ MessageBox(0, "Could not load shell32.dll", "Install.exe", MB_OK);
+ return 1;
+ }
+ f_SHGetSpecialFolderPath = (HRESULT (WINAPI*)(HWND,LPTSTR,int,BOOL))GetProcAddress(shell32, "SHGetSpecialFolderPathA");
+ if(!f_SHGetSpecialFolderPath) {
+ MessageBox(0, "Could not load shell32.dll", "Install.exe", MB_OK);
+ return 1;
+ }
+
+ HRESULT coret = CoInitialize(NULL);
+ if(FAILED(coret)) {
+ MessageBox(0, "Could not initialize COM interface", "Install.exe", MB_OK);
+ return 1;
+ }
+
+ path_programfiles[0] = 0;
+ f_SHGetSpecialFolderPath(NULL, path_programfiles, CSIDL_PROGRAM_FILES, 0);
+
+ if(!RegisterClassEx(&wcl_background)) {
+ MessageBox(0, "Could not register window background class", "Install.exe", MB_OK);
+ return 1;
+ }
+
+ HWND background = CreateWindow(wcl_background.lpszClassName, "Setup SWFTools",
+ 0, 0, 0,
+ GetSystemMetrics(SM_CXFULLSCREEN),
+ GetSystemMetrics(SM_CYFULLSCREEN),
+ NULL, NULL, me,
+ (void*)"background");