Robert, some extra behavior can be obtained with exchanging a hook for external calls. In your case for latex you can use WinApi.SW_HIDE option (+ yours WinApi.CREATE_NO_WINDOW).
Code: Select all
MODULE ToolsSilentExtCall;
IMPORT SYSTEM, WinApi, Dialog;
TYPE
ExtCallHook = POINTER TO RECORD (Dialog.ExtCallHook) END;
CallName = ARRAY [untagged] 8191 OF CHAR;
CallNamePtr = POINTER TO CallName;
VAR
callNameTaken: BOOLEAN;
lastresult-: INTEGER;
PROCEDURE Open (lpParameter: INTEGER): INTEGER; (* runs in a thread *)
VAR
fileNamePtr: CallNamePtr; fileName: CallName;
hinst: WinApi.HINSTANCE;
BEGIN
fileNamePtr := SYSTEM.VAL(CallNamePtr, lpParameter);
fileName := fileNamePtr$;
callNameTaken := TRUE;
hinst := WinApi.ShellExecuteW(0, "open", fileName, NIL, NIL, WinApi.SW_SHOW);
RETURN 0
END Open;
PROCEDURE (h: ExtCallHook) Open* (IN fileName: ARRAY OF CHAR);
VAR t: WinApi.HANDLE; res: WinApi.BOOL;
win_fileName: CallName;
BEGIN
IF Dialog.IsWine() THEN (* for security: prevent executing arbitrary commands including arguments *)
win_fileName := "winebrowser " + fileName$
ELSE
win_fileName := fileName$
END;
callNameTaken := FALSE;
t := WinApi.CreateThread(NIL, 4096 * 4, Open, SYSTEM.ADR(win_fileName), {}, NIL);
IF t # 0 THEN
WHILE ~callNameTaken DO
WinApi.Sleep(1)
END;
res := WinApi.CloseHandle(t)
END
END Open;
PROCEDURE Run (lpParameter: INTEGER): INTEGER; (* runs in a thread *)
VAR
exeNamePtr: CallNamePtr; exeName: CallName;
info: WinApi.STARTUPINFOW; process: WinApi.PROCESS_INFORMATION;
BEGIN
exeNamePtr := SYSTEM.VAL(CallNamePtr, lpParameter);
exeName := exeNamePtr$;
callNameTaken := TRUE;
WinApi.GetStartupInfoW(info);
info.wShowWindow := WinApi.SW_HIDE;
lastresult := WinApi.CreateProcessW(NIL, exeName, NIL, NIL, WinApi.FALSE, WinApi.CREATE_NO_WINDOW, 0, NIL, info, process);
RETURN 0
END Run;
PROCEDURE (h: ExtCallHook) Run* (IN exeName: ARRAY OF CHAR);
VAR t: WinApi.HANDLE; res: WinApi.BOOL;
BEGIN
callNameTaken := FALSE;
t := WinApi.CreateThread(NIL, 4096 * 4, Run, SYSTEM.ADR(exeName), {}, NIL);
IF t # 0 THEN
WHILE ~callNameTaken DO
WinApi.Sleep(1)
END;
res := WinApi.CloseHandle(t)
END
END Run;
PROCEDURE Init*;
VAR extCallHook: ExtCallHook;
BEGIN
NEW(extCallHook); Dialog.SetExtCallHook(extCallHook)
END Init;
END ToolsSilentExtCall.