2 Simple program to start Emacs with its console window hidden.
4 This program is provided purely for convenience, since most users will
5 use Emacs in windowing (GUI) mode, and will not want to have an extra
6 console window lying around. */
9 You may want to define this if you want to be able to install updated
10 emacs binaries even when other users are using the current version.
11 The problem with some file servers (notably Novell) is that an open
12 file cannot be overwritten, deleted, or even renamed. So if someone
13 is running emacs.exe already, you cannot install a newer version.
14 By defining CHOOSE_NEWEST_EXE, you can name your new emacs.exe
15 something else which matches "emacs*.exe", and runemacs will
16 automatically select the newest emacs executeable in the bin directory.
17 (So you'll probably be able to delete the old version some hours/days
21 /* #define CHOOSE_NEWEST_EXE */
28 WinMain (HINSTANCE hSelf
, HINSTANCE hPrev
, LPSTR cmdline
, int nShow
)
31 SECURITY_ATTRIBUTES sec_attrs
;
32 SECURITY_DESCRIPTOR sec_desc
;
33 PROCESS_INFORMATION child
;
34 int wait_for_child
= FALSE
;
35 DWORD priority_class
= NORMAL_PRIORITY_CLASS
;
39 char modname
[MAX_PATH
];
41 if (!GetModuleFileName (NULL
, modname
, MAX_PATH
))
43 if ((p
= strrchr (modname
, '\\')) == NULL
)
47 new_cmdline
= alloca (MAX_PATH
+ strlen (cmdline
) + 1);
48 strcpy (new_cmdline
, modname
);
50 #ifdef CHOOSE_NEWEST_EXE
52 /* Silly hack to allow new versions to be installed on
53 server even when current version is in use. */
55 char * best_name
= alloca (MAX_PATH
+ 1);
56 FILETIME best_time
= {0,0};
59 p
= new_cmdline
+ strlen (new_cmdline
);
60 strcpy (p
, "\\emacs*.exe ");
61 fh
= FindFirstFile (new_cmdline
, &wfd
);
62 if (fh
== INVALID_HANDLE_VALUE
)
66 if (wfd
.ftLastWriteTime
.dwHighDateTime
> best_time
.dwHighDateTime
67 || (wfd
.ftLastWriteTime
.dwHighDateTime
== best_time
.dwHighDateTime
68 && wfd
.ftLastWriteTime
.dwLowDateTime
> best_time
.dwLowDateTime
))
70 best_time
= wfd
.ftLastWriteTime
;
71 strcpy (best_name
, wfd
.cFileName
);
74 while (FindNextFile (fh
, &wfd
));
77 strcpy (p
, best_name
);
81 strcat (new_cmdline
, "\\emacs.exe ");
84 /* Append original arguments if any; first look for arguments we
85 recognise (-wait, -high, and -low), and apply them ourselves. */
86 while (cmdline
[0] == '-' || cmdline
[0] == '/')
88 if (strncmp (cmdline
+1, "wait", 4) == 0)
90 wait_for_child
= TRUE
;
93 else if (strncmp (cmdline
+1, "high", 4) == 0)
95 priority_class
= HIGH_PRIORITY_CLASS
;
98 else if (strncmp (cmdline
+1, "low", 3) == 0)
100 priority_class
= IDLE_PRIORITY_CLASS
;
106 strcat (new_cmdline
, cmdline
);
108 /* Set emacs_dir variable if runemacs was in "%emacs_dir%\bin". */
109 if ((p
= strrchr (modname
, '\\')) && stricmp (p
, "\\bin") == 0)
112 for (p
= modname
; *p
; p
++)
113 if (*p
== '\\') *p
= '/';
114 SetEnvironmentVariable ("emacs_dir", modname
);
117 memset (&start
, 0, sizeof (start
));
118 start
.cb
= sizeof (start
);
119 start
.dwFlags
= STARTF_USESHOWWINDOW
;
120 start
.wShowWindow
= SW_HIDE
;
122 sec_attrs
.nLength
= sizeof (sec_attrs
);
123 sec_attrs
.lpSecurityDescriptor
= NULL
;
124 sec_attrs
.bInheritHandle
= FALSE
;
126 if (CreateProcess (NULL
, new_cmdline
, &sec_attrs
, NULL
, TRUE
, priority_class
,
127 GetEnvironmentStrings (), NULL
, &start
, &child
))
131 WaitForSingleObject (child
.hProcess
, INFINITE
);
132 GetExitCodeProcess (child
.hProcess
, &ret_code
);
134 CloseHandle (child
.hThread
);
135 CloseHandle (child
.hProcess
);
139 return (int) ret_code
;
142 MessageBox (NULL
, "Could not start Emacs.", "Error", MB_ICONSTOP
);