On Sun, Jul 23, 2006 at 09:29:28AM +0200, Enrico Forestieri wrote:
> On Sat, Jul 22, 2006 at 10:23:55PM -0500, Bo Peng wrote:
>
> > Dear list,
> >
> > Using this small utility, we can hide the console window of lyx by
> > starting lyx with
> >
> > runWithHiddenConsole cmd.exe /c lyx.exe
> >
> > I suggest that we remove the hide console code in os_win32.c if this
> > program is used by the windows installer.
> >
> > Comments?
>
> We need to set some environment variables. Please have a look at the
> attached program modified from the same source as yours.
>
> I use it as follows:
>
> hidecmd /LC_ALL=it_IT /AIK_DATA_DIR="C:\Programmi\LyX14\aiksaurus" lyx.exe
>
> I don't see the need to use "cmd /c".
Ehm... here is the attachment.
--
Enrico
// Hidecmd starts a program hiding its console window, optionally waiting
// for its termination and setting environment variables.
//
// Usage: hidecmd [/w] [/VAR=val] <filename> [<params>]
// where: /w wait for program termination
// /VAR=val set VAR=val
// <filename> executable program
// <params> program parameters
//
// Compile: gcc -mno-cygwin -mwindows hidecmd.c -o hidecmd
#include <process.h>
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lCmd, int nCmd)
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
char *s;
char *e;
int i;
int err = 0;
int bWait = 0;
DWORD exitcode = 0;
char delim = ' ';
char *cmdline = GetCommandLine();
char var[100];
char val[100];
if (*cmdline == '\"') {
delim = '\"';
cmdline++;
}
while (*cmdline != delim && *cmdline != 0)
cmdline++;
if (*cmdline == delim)
cmdline++;
while (*cmdline != 0 && (*cmdline == ' ' || *cmdline == '\t'))
cmdline++;
while (*cmdline == '/') {
if ((cmdline[1] | 0x20) == 'w' && cmdline[2] == ' ') {
bWait = 1;
cmdline += 3;
} else {
cmdline++;
s = var;
e = s + sizeof(var) - 1;
while (*cmdline != 0 && *cmdline != '=') {
if (s < e) {
*s++ = *cmdline++;
} else {
cmdline++;
err = 1;
}
}
*s = 0;
if (*cmdline == '=')
cmdline++;
delim = ' ';
if (*cmdline == '\"') {
delim = '\"';
cmdline++;
}
s = val;
e = s + sizeof(val) - 1;
while (*cmdline != delim && *cmdline != 0) {
if (s < e) {
*s++ = *cmdline++;
} else {
cmdline++;
err = 1;
}
}
*s = 0;
if (*cmdline == delim)
cmdline++;
SetEnvironmentVariable(var, val);
}
while (*cmdline != 0 && (*cmdline == ' ' || *cmdline == '\t'))
cmdline++;
}
if (*cmdline == 0) {
MessageBox(0, "About:\n\nStarts a program hiding its console window,
optionally waiting\nfor its termination and setting environment
variables.\n\nUsage:\n\thidecmd [/w] [/VAR=val] <filename>
[<params>]\n\n\t/w\t\twait for program termination\n\t/VAR=val\t\tset
VAR=val\n\t<filename>\texecutable program\n\t<params>\tprogram parameters",
"Error: Incorrect usage", 0);
ExitProcess(0);
}
if (err) {
MessageBox(0, "One of the specified environment variables or its value
is too long.", "Error: Variable name or value too long", 0);
ExitProcess(0);
}
/* create process with new console */
s = (char *) &si;
for (i = 0; i < sizeof(si); i++)
s[i] = 0x00;
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
if (CreateProcess(NULL, cmdline, NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
NULL, NULL, &si, &pi)) {
if (bWait)
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
else
exitcode = GetLastError();
/* terminate this */
ExitProcess(exitcode);
}