⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winsetup.cpp

📁 GSview 4.6 PostScript previewer。Ghostscript在MS-Windows, OS/2 and Unix下的图形化接口
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  }
}

void
goto_page(HWND hwnd, int id)
{
WIZPAGE *page;
HWND hbutton;
    page = find_page_from_id(id);
    if (page) {
	ShowWindow(hwnd, SW_HIDE);
	ShowWindow(page->hwnd, SW_SHOW);
	hwnd_current = page->hwnd;
	if (IsWindowEnabled(GetDlgItem(page->hwnd, IDNEXT)))
	    hbutton = GetDlgItem(page->hwnd, IDNEXT);
	else
	    hbutton = GetDlgItem(page->hwnd, IDCANCEL);
	SetFocus(hbutton);
	SendMessage(hbutton, BM_SETSTYLE, (WPARAM)BS_DEFPUSHBUTTON, TRUE);
	return;
    }
}

#ifdef __BORLANDC__
#pragma argsused
#endif
/* exit from program */
int
done(HWND hwnd)
{
    PostQuitMessage(0);
    return 0;
}

/* commence installation */
int
finish(HWND hwnd)
{
WIZPAGE *page;
    page = find_page_from_id(IDD_ASSOC);
    g_bAssocPS = (BOOL)SendDlgItemMessage(page->hwnd, IDC_CFG41, 
	BM_GETCHECK, (WPARAM)0, (LPARAM)0);
    g_bAssocPDF = (BOOL)SendDlgItemMessage(page->hwnd, IDC_CFG42, 
	BM_GETCHECK, (WPARAM)0, (LPARAM)0);

    page = find_page_from_id(IDD_CONFIG);
    install_autoexec = (BOOL)SendDlgItemMessage(page->hwnd, IDM_AUTOEXECBAT, BM_GETCHECK, 
		    (WPARAM)0, (LPARAM)0);
    install_autoexecbak = (BOOL)SendDlgItemMessage(page->hwnd, IDM_AUTOEXECBAK, BM_GETCHECK, 
		    (WPARAM)0, (LPARAM)0);

    page = find_page_from_id(IDD_DIR);
    GetDlgItemText(page->hwnd, ID_ANSWER, g_szTargetDir, sizeof(g_szTargetDir));

    page = find_page_from_id(IDD_FINISH);
    GetDlgItemText(page->hwnd, IDM_PROGMAN2, g_szTargetGroup, sizeof(g_szTargetGroup));
    g_bAllUsers = SendDlgItemMessage(page->hwnd, IDC_ALLUSERS, 
	BM_GETCHECK, 0, 0) == BST_CHECKED;
    g_bCreateFolder = SendDlgItemMessage(page->hwnd, IDC_CREATEFOLDER, 
	BM_GETCHECK, 0, 0) == BST_CHECKED;

    PostMessage(hwnd, WM_COMMAND, (WPARAM)IDFINISH, (LPARAM)0);
    return 0;
}

BOOL
update_config(void)
{
FILE *infile, *outfile;
char inname[MAXSTR], outname[MAXSTR];
char buf[MAXSTR];
char line[1024];
char tempname[MAXSTR];
int i;
BOOL autoexec_exists = TRUE;
    
    strcpy(inname, bootdrive);
    strcat(inname, "\\autoexec.bat");

    strcpy(tempname, bootdrive);
    strcat(tempname, "\\GSXXXXXX");
    if (mktemp(tempname) == (char *)NULL) {
	load_string(IDS_CANTCREATETEMPFILE, error_message, sizeof(error_message));
	return FALSE;
    }

    if ( (infile = fopen(inname, "r")) == (FILE *)NULL) {
	/* autoexec.bat doesn't exist */
	load_string(IDS_CANTOPENREAD, buf, sizeof(buf));
	sprintf(error_message, buf, inname);
	gs_addmess("autoexec.bat already exists\n");
	autoexec_exists = FALSE;
	/* not an error */
    }
    if ( (outfile = fopen(tempname, "w")) == (FILE *)NULL)  {
	load_string(IDS_CANTOPENWRITE, buf, sizeof(buf));
	sprintf(error_message, buf, tempname);
	return FALSE;
    }
    if (infile != (FILE *)NULL) {
	while (fgets(line, sizeof(line), infile)) {
	    if (strnicmp(line, "SET TEMP=", 9)==0) {
		/* it has been added recently */
		fclose(outfile);
		fclose(infile);
		unlink(tempname);
		return TRUE;
	    }
	    fputs(line, outfile);
	}
    }
    sprintf(line, "SET TEMP=%s\\\n", bootdrive);
    fputs(line, outfile);

    fclose(outfile);
    if (infile != (FILE *)NULL)
	fclose(infile);

    if (autoexec_exists) {
	if (install_autoexecbak) {
	    for (i=0; i<=999; i++) {
		sprintf(outname, "%s\\autoexec.%03d", bootdrive, i);
		if ( (infile = fopen(outname, "r")) != (FILE *)NULL)
		    fclose(infile);
		else
		    break;   /* found a suitable name */
	    }
	    if (rename(inname, outname)) {
		load_string(IDS_ERRORRENAME, buf, sizeof(buf));
		sprintf(error_message, buf, inname, outname);
		return FALSE;
	    }
	    strcpy(autoexec_bak, outname);
	}
	else
	    unlink(inname);
    }

    if (rename(tempname, inname)) {
	load_string(IDS_ERRORRENAME, buf, sizeof(buf));
	sprintf(error_message, buf, tempname, inname);
	return FALSE;
    }

    return TRUE;
}

BOOL
update_ini(char *ininame)
{
char buf[16];
char secver[64];
    sprintf(secver, "GSview-%s", GSVIEW_DOT_VERSION);
    sprintf(buf, "%3d", GS_REVISION);
    WritePrivateProfileString(secver, "Configured", "0", ininame);
    WritePrivateProfileString(secver, "GSversion", buf, ininame);
    return TRUE;
}

int
create_object(void)
{

/* MAY NEED TO ADD MORE CODE HERE */

    /* tell user what we have done */
    /*
    SetDlgItemText(find_page_from_id(IDD_DONE)->hwnd, IDD_DONE_GROUP, "Installed OK");
    */

    return 0;
}


DLGPROC lpMainDlgProc;


BOOL
create_dialog(void)
{
WIZPAGE *page;
char buf[MAXSTR];
    // main dialog box
    g_hMain = CreateDialogParam(g_hLanguage, MAKEINTRESOURCE(IDD_MAIN), (HWND)NULL, MainDlgProc, (LPARAM)NULL);
    centre_dialog(g_hMain);
    
    // initialize targets
    cinst.SetMessageFunction(message_box);
    if (!cinst.Init(g_szSourceDir, "filelist.txt")) {
	if (g_hMain != (HWND)NULL)
	    DestroyWindow(g_hMain);
	return FALSE;
    }

    if (init_temp()) {
        page = find_page_from_id(IDD_CONFIG);
	SendDlgItemMessage(page->hwnd, IDM_AUTOEXECBAT, BM_SETCHECK, 
		    (WPARAM)1, (LPARAM)0);
	SendDlgItemMessage(page->hwnd, IDM_AUTOEXECBAK, BM_SETCHECK, 
		    (WPARAM)1, (LPARAM)0);
	find_page_from_id(IDD_FINISH)->prev = IDD_CONFIG; 
    }

    sprintf(buf, "%d.%02d - %d.%02d", 
	GS_REVISION_MIN / 100, GS_REVISION_MIN % 100,
	GS_REVISION_MAX / 100, GS_REVISION_MAX % 100);
    SetDlgItemText(find_page_from_id(IDD_INTRO)->hwnd,
	IDD_INTRO_T3, buf);


    page = find_page_from_id(IDD_ASSOC);
    SendDlgItemMessage(page->hwnd, IDC_CFG41, BM_SETCHECK, 
	    g_bAssocPS ? BST_CHECKED : BST_UNCHECKED, 0);
    SendDlgItemMessage(page->hwnd, IDC_CFG42, BM_SETCHECK, 
	    g_bAssocPDF ? BST_CHECKED : BST_UNCHECKED, 0);

    page = find_page_from_id(IDD_FINISH);
    SetDlgItemText(page->hwnd, IDM_PROGMAN2, g_szTargetGroup); 
    SendDlgItemMessage(page->hwnd, IDC_CREATEFOLDER, BM_SETCHECK, 
	    g_bCreateFolder ? BST_CHECKED : BST_UNCHECKED, 0);
    EnableWindow(GetDlgItem(page->hwnd, IDC_ALLUSERS), is_winnt);
    SendDlgItemMessage(page->hwnd, IDC_ALLUSERS, BM_SETCHECK, 
	    g_bAllUsers ? BST_CHECKED : BST_UNCHECKED, 0);
    
    page = find_page_from_id(IDD_DIR);
    SetDlgItemText(page->hwnd, ID_ANSWER, g_szTargetDir);


    ShowWindow(g_hMain, SW_SHOWNORMAL);

    return TRUE;
}

BOOL get_inipath(char *buf, int len)
{
	/* get path to INI file */
	buf[0] = '\0';
	/* allow for user profiles */
	if (is_win4) {
	    LONG rc;
	    HKEY hkey;
	    DWORD keytype;
	    DWORD cbData;
	    DWORD fa;
	    /* Find the user profile directory */
	    rc = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\ProfileReconciliation", 0, KEY_READ, &hkey);
	    if (rc == ERROR_SUCCESS) {
		cbData = len - sizeof(szIniName);
		keytype =  REG_SZ;
		rc = RegQueryValueEx(hkey, "ProfileDirectory", 0, &keytype, (LPBYTE)buf, &cbData);
		RegCloseKey(hkey);
	    }
	    if (rc == ERROR_SUCCESS) {
		fa = GetFileAttributes(buf);
		if ((fa != 0xffffffff) && (fa & FILE_ATTRIBUTE_DIRECTORY))
		    strcat(buf, "\\");
		else
		    buf[0] = '\0';
	    }
	    else {
		    /* If we didn't succeed, use the Windows directory */
		    buf[0] = '\0';
	    }
	}
	if (buf[0] == '\0') {
	    DWORD fa;
	    /* If we didn't succeed, try %USERPROFILE% */
	    char *p = getenv("USERPROFILE");
	    if (p && *p) {
		strcpy(buf, p);
#ifdef __BORLANDC__
		OemToCharBuff(buf, buf, lstrlen(buf));
#endif
		p = buf + strlen(buf) - 1;
		if ((*p == '\\') || (*p == '/'))
		    *p = '\0';
		/* check if USERPROFILE contains a directory name */
		fa = GetFileAttributes(buf);
		if ((fa != 0xffffffff) && (fa & FILE_ATTRIBUTE_DIRECTORY))
		    strcat(buf, "\\");
		else
		    buf[0] = '\0';
	    }
	}
	if (strlen(buf) + strlen(szIniName) + 1 >= len)
	   buf[0] = '\0';
	strcat(buf, szIniName);
	return TRUE;
}

BOOL
create_registry_type(const char *keyname, const char *program, 
    const char *description)
{
    const char shellsubkey[]= "\\shell";
    const char opensubkey[] = "\\open";
    const char printsubkey[] = "\\print";
    const char commandsubkey[] = "\\command";
    char kbuf[MAXSTR];
    char buf[MAXSTR];

    BOOL flag = TRUE;

    if (flag)
	flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, keyname);
    if (flag)
	flag = cinst.RegistrySetValue(NULL, description);

    strcpy(kbuf, keyname);
    strcat(kbuf, shellsubkey);
    if (flag)
	flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, kbuf);

    strcat(kbuf, opensubkey);
    if (flag)
	flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, kbuf);

    strcat(kbuf, commandsubkey);
    if (flag)
	flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, kbuf);
    sprintf(buf, "\042%s\042 \042%%1\042", program);
    if (flag)
	flag = cinst.RegistrySetValue(NULL, buf);

    strcpy(kbuf, keyname);
    strcat(kbuf, shellsubkey);
    strcat(kbuf, printsubkey);
    if (flag)
	flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, kbuf);

    strcat(kbuf, commandsubkey);
    if (flag)
	flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, kbuf);
    sprintf(buf, "\042%s\042 /p \042%%1\042", program);
    if (flag)
	flag = cinst.RegistrySetValue(NULL, buf);

    strcpy(kbuf, keyname);
    strcat(kbuf, "\\DefaultIcon");
    if (flag)
	flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, kbuf);
    sprintf(buf, "%s,3", program);
    if (flag)
	flag = cinst.RegistrySetValue(NULL, buf);

    cinst.RegistryCloseKey();

    return flag;
}


BOOL
install_prog()
{
	BOOL flag;
	char *regkey1 = "Ghostgum";
	char *regkey2 = "GSview";
	char buf[MAXSTR];
	char szProgram[MAXSTR];
	char szReadme[MAXSTR];
	char szArguments[MAXSTR];
	char szDescription[MAXSTR];
	
	if (g_bQuit)
		return FALSE;
	
	cinst.SetMessageFunction(gs_addmess);
	cinst.SetTargetDir(g_szTargetDir);
	cinst.SetTargetGroup(g_szTargetGroup);
	cinst.SetAllUsers(g_bAllUsers);
	if (!cinst.Init(g_szSourceDir, "filelist.txt"))
		return FALSE;
	
	// Uninstall any previous version in same directory
	gs_addmess("Uninstalling previous version...\n");
	cinst.Uninstall(UNINSTALLPROG, g_bBatch);

	// Get GS version number
	gs_addmess("Installing GSview...\n");

	// copy files
	if (!cinst.InstallFiles(g_bNoCopy, &g_bQuit)) {
		gs_addmess("Install failed\n");
		return FALSE;
	}
	
	if (g_bQuit)
		return FALSE;

	// Set up program EXE name, used by registry and start menu
	strcpy(szProgram, g_szTargetDir);
	strcat(szProgram, "\\");
	strcat(szProgram, cinst.GetMainDir());
	strcat(szProgram, "\\gsview32.exe");
	strcpy(szArguments, "");
	
	// write registry entries
	gs_addmess("Updating Registry\n");
	if (!cinst.RegistryBegin()) {
	    gs_addmess("Failed to begin registry update\n");
	    return FALSE;
	}

	sprintf(buf, "SOFTWARE\\%s", regkey1);
	if (!cinst.RegistryOpenKey(HKEY_LOCAL_MACHINE, buf)) {
	    gs_addmess("Failed to open/create registry application key\n");
	    return FALSE;
	}

	sprintf(buf, "SOFTWARE\\%s\\%s", regkey1, regkey2);
	if (!cinst.RegistryOpenKey(HKEY_LOCAL_MACHINE, buf)) {
	    gs_addmess("Failed to open/create registry application key\n");
	    return FALSE;
	}

	if (!cinst.RegistrySetValue(GSVIEW_DOT_VERSION, g_szTargetDir)) {
	    gs_addmess("Failed to add registry value\n");
	    return FALSE;
	}

	cinst.RegistryCloseKey();

	// Write App Paths to registry
	sprintf(buf, 
	    "Software\\Microsoft\\Windows\\CurrentVersion\\App Paths\\%s",
	     "gsview32.exe");
   
	flag = cinst.RegistryOpenKey(HKEY_LOCAL_MACHINE, buf);
	if (flag) {
	    flag = cinst.RegistrySetValue(NULL, szProgram);
	    if (flag) {
		strcpy(buf, g_szTargetDir);
		strcat(buf, "\\");
		strcat(buf, cinst.GetMainDir());
		flag = cinst.RegistrySetValue("Path", buf);
	    }
	    if (!flag)
	        gs_addmess("Failed to open/create registry App Paths values\n");
	    cinst.RegistryCloseKey();
	}
	else
	    gs_addmess("Failed to open/create registry App Paths key\n");
	if (!flag)
	   return flag;


	// now put in assocations

	const char *psmime="application/postscript";
	const char *pdfmime="application/pdf";
	const char *contentname="Content Type";
	const char *extension="Extension";
	const char *pskey="psfile";
	const char *pdfkey="pdffile";
	const char *psext=".ps";
	const char *epsext=".eps";
	const char *pdfext=".pdf";

	if (g_bAssocPS) {
	    BOOL flag = TRUE;
	    if (flag)
	        flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, psext);
	    if (flag)
		flag = cinst.RegistrySetValue(NULL, pskey);
	    if (flag)
		flag = cinst.RegistrySetValue(contentname, psmime);

	    if (flag)
		flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, epsext);
	    if (flag)
		flag = cinst.RegistrySetValue(NULL, pskey);
	    if (flag)
		flag = cinst.RegistrySetValue(contentname, psmime);

	    sprintf(buf, "MIME\\Database\\%s\\%s", contentname, psmime);
	    if (flag)
		flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, buf);
	    if (flag)
		flag = cinst.RegistrySetValue(extension, psext);

	    if (flag)
		flag = create_registry_type(pskey, szProgram, "PostScript");
	    if (!flag) {
		gs_addmess("Failed to add PS file association\n");
		return FALSE;
	    }
	}

	if (g_bAssocPDF) {
	    BOOL flag = TRUE;
	    if (flag)
	        flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, pdfext);
	    if (flag)
		flag = cinst.RegistrySetValue(NULL, pdfkey);
	    if (flag)
		flag = cinst.RegistrySetValue(contentname, pdfmime);

	    sprintf(buf, "MIME\\Database\\%s\\%s", contentname, pdfmime);
	    if (flag)
		flag = cinst.RegistryOpenKey(HKEY_CLASSES_ROOT, buf);
	    if (flag)
		flag = cinst.RegistrySetValue(extension, pdfext);

	    if (flag)
		flag = create_registry_type(pdfkey, szProgram, "Portable Document Format");
	    if (!flag) {
		gs_addmess("Failed to add PDF file association\n");
		return FALSE;
	    }
	}


	if (!cinst.RegistryEnd()) {
		gs_addmess("Failed to end registry update\n");
		return FALSE;
	}
	if (g_bQuit)
		return FALSE;
	
	if (g_bCreateFolder) {
	    // Add Start Menu items
	    gs_addmess("Adding Start Menu items\n");
	    if (!cinst.StartMenuBegin()) {
		    gs_addmess("Failed to begin Start Menu update\n");
		    return FALSE;
	    }
	    // szProgram is already set
	    sprintf(szDescription, "GSview %s", GSVIEW_DOT_VERSION);
	    if (!cinst.StartMenuAdd(szDescription, szProgram, szArguments)) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -