The integrated cross-platform development tool for ANSI Common Lisp LispWorks logo

Lisp Knowledgebase



Title: How to start a Windows executable such as Netscape

ID: 16019


Product: LispWorks for Windows
Version: 4.1, 4.2
OS: All Windows platforms

Description:
LispWorks 4.2
Use SYS:CALL-SYSTEM. To start a process and read from it, use SYS:OPEN-PIPE.

If you want use the Windows Shell API, then follow the notes in 1) below.
Note that the HWEB::SHELL-OPEN-COMMAND functionality is in a loadable module in the 4.2 release: do
(require "hqn-web")
to load it.

LispWorks 4.1
In this release, the functionality is provided under UNIX via SYS:CALL-SYSTEM, but nothing
"officially" for the PC product in version4.1

However, there are a few things available under the Windows implementation:

(1) To start the default browser, you can call ShellExecute, with
operation "open", and the path to the file e.g. by
(HWEB::SHELL-OPEN-COMMAND <path>)

If the default browser is Internet Explorer, this suffices, because
successive calls use the same running instance of the browser, by
implicit DDE in the Windows Shell API.

If the default browser is Netscape, each call to ShellExecute fires up
a new instance of Netscape which is not very nice. The way around that
is to use Netscape's DDE interface, only calling ShellExecute if that
fails (i.e. Netscape is not yet running). LispWorks functions you can
call are WW:NETSCAPE-OPEN-URL and WW:NETSCAPE-ACTIVATE.

(2) To start another application, in general you can call the
unsupported internal functions WIN32::OPEN-PIPE (see below) and
WIN32::CALL-SYSTEM
. WIN32::CALL-SYSTEM takes the same arguments but
doesn't return until the command has finished.

---

Package: WIN32

Syntax: OPEN-PIPE &KEY APPLICATION-NAME COMMAND-LINE CURRENT-DIRECTORY

Invokes CreateProcess and returns a stream which you can read from.
See the MS documentation on CreateProcess for interpretation of the
arguments. Beware that the CL input functions may hang if there's no
input on the stream so check for this using LISTEN eg.


CL-USER 90 > (defvar *pipe*)
*PIPE*


CL-USER 91 > (setf *pipe* (win32::open-pipe :command-line "net view"))
#S(IO::TWO-WAY-PIPE-STREAM IO::UNTYID-CHAR NIL IO::INPUT #<FILE-STREAM
NIL> IO::OUTPUT #<FILE-STREAM NIL> IO::HPROCESS 372)


CL-USER 92 > (loop (loop while (and (listen *pipe*) (print (read-line
*pipe*))))
                  (sleep 1)
                  (unless (listen *pipe*) (return)))


"Server Name            Remark"
""
"----------------------------------------------------------------------"


[... lots of machine names elided ... ]

"The command completed successfully."
""
NIL


CL-USER 93 >


See Also:
Workaround:
Patch:

Hardware:N/A
Summary:
Bug#:
Patch Enhancement#:
Reported:

Top | Back