📄 winsetup.cpp
字号:
}
}
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 + -