On 2023-04-02 8:38 am, Richard Shann wrote:
there used to be an executable lilypond-windows.exe in addition to the
lilypond.exe which has also vanished. I suspect it was compiled using
the option
-mconsole
passed to gcc as this is how Denemo is compiled to avoid leaving a
terminal around that would tempt the user to kill everything by
dismissing it (Windows users are generally not familiar with
terminals).
Yup. On Windows, the executable takes two forms based on whether it is
CLI-based or GUI-based. lilypond-windows.exe was in all practical ways
identical to lilypond.exe except that it had WinMain as its entrypoint
instead of main. This meant Windows did not automatically allocate a
console window. Do note that even GUI-based applications are afforded a
text console but they must explicitly call the AllocConsole API.
If I understand this correctly, it looks like I will have to spawn a
process that runs a windows batch file that processes the command line
parameters and synthesizes the names of the log file that LilyPond used
to create and then calls LilyPond with re-direction of the output. I'm
not sure that this can be done without a terminal popping up to annoy
the user.
I have never looked at Denemo or its source code, so what I am going to
say might not be so trivially applicable. But in the Win32 API, you can
call CreateProcess [1] and use the process flag CREATE_NO_WINDOW [2].
This should prevent the console window appearing if the child process is
CLI-based.
[1]:
https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createprocessa
[2]:
https://learn.microsoft.com/en-us/windows/win32/procthread/process-creation-flags
Is there anyway of spawning a LilyPond 2.24 process on Windows now
without plaguing the user with terminals?
You might be able to shim with a VBS wrapper. I do this a lot for
custom scheduled tasks that would normally run in the terminal but that
I do not want to interrupt what I am doing by spawning a window at odd
times. Something like this should work, passing arguments to the script
along to LilyPond:
''''
' Turn WScript.Arguments into a proper array.
Dim args()
ReDim args(WScript.Arguments.Count - 1)
For i = 0 To WScript.Arguments.Count - 1
args(i) = Chr(34) & WScript.Arguments(i) & Chr(34)
Next
Dim shell
Set shell = WScript.CreateObject("WScript.Shell")
shell.Run "lilypond.exe " & Join(args), 0, True
''''
NOTE: The important parameter here is the zero (0) to shell.Run. This
hides the spawned process. The True waits for the child process to
finish, which probably is what you need for this use case. But if you
just want to fire off a child process and not have the scripting host
stick around, change that to False.
-- Aaron Hill