Win32.CreateShellLink() example source-code in C
Name Last modified Size Description
files.md5 23-Oct-1999 17:58 1k
makefile 23-Oct-1999 03:40 1k
setenv.bat 23-Oct-1999 16:35 1k
setup.bat 23-Oct-1999 16:40 1k
shlink.c 23-Oct-1999 03:38 5k
README for shlink.
shlink is hereby placed in the public domain.
This program comes with ABSOLUTELY NO WARRANTY, EXPRESSED OR IMPLIED.
USE AT YOUR OWN RISK.
> These raises two issues someone here might be able to help with:
> 1) What does it take to make a .pif work on NT? If the answer is
> "nothing", why might these pifs not be working.
I haven't seen this documented anywhere, but it appears that when
NT sees a .pif file it assumes it's dealing with a 16-bit DOS
program and hands it off to the ntvdm DOS emulator. On my NT
system, launching e.pif results in the emulated DOS reporting "Out
of environment space" a few times and exiting before invoking JRE.
Can it be made to work? Probably, by tweaking the config.sys for
the emulated DOS environment to increase the (16-bit) environment size...
but it turns out, on Win32 systems, you can create "Shortcuts"
(which is really what you want) via an API call and bypass the
.pif files completely. Downside: you'll need a small .exe to
call the IShellLink() API, but I've written one :-) And I think
I can answer your last question about creating .pif's. While the
IShellLink() API normally creates Shortcut files ending in ".LNK",
in a fine example of Microsoft consistency, when IShellLink() is
used on Win9x (but not on NT) to create a shortcut pointing to a
.bat file, it actually ends up creating a .pif file even though
the name you specified ended in .lnk! I assume this behavior
applies to 16-bit .com and .exe's also.
You can find the utility to create Shortcuts at
It's statically linked with libc.lib to not require msvcrt.dll.
I've tested shlink on win95/8 and NT.
Also in this directory you'll find a modified version of E's
setup.bat which calls shlink.exe instead of copying .pif's. In
addition to creating the Shortcut, IShellLink() allows
specifying command line args, setting a working directory, choosing
an icon and setting the initial window state (iconified, maximized,
...) shlink.exe supports only a few of these features but it'd be
trivial to add more.
Watch out for the ~127 character command-line limit of
Win9x... I got around this in setup.bat by using environment
variables on the shlink command line rather than full paths. Ug.
Actually I'm surprised this worked. I can only assume env. variable
expansion is being done in a larger buffer. Yet another reason to have
a real Installer.
> 2) What should I "if" on in my .bat files so I can use Dan's logic on WinNT
> but the older logic on Win9x?. Which should work in Win2000? Is there a
> better way to handle this?
On NT (4, at least), %OS% is set to "Windows_NT".
Also, %SystemRoot% points to the root of the NT install (c:\winnt by
default). On Win9x, %windir% points to the root of the Windows install.
> Closely related to #1: Is there any known way to generate a .pif from a
> program? This would be necessary to write a real
> installer. Alternatively, what are the Mozilla-compatible open-source
> install programs, whether or not they're Java specific, as long as they
> generate working .pifs?
Well, hopefully this is useful.