home *** CD-ROM | disk | FTP | other *** search
- #include <direct.h>
- #include <dos.h>
-
- #define FAR far
- #include "wztools.h"
-
- #define INT int
- #define HANDLE int
- #define CHAR char
- #define PSTR char *
- #define PCHAR char *
- #define LPSTR char FAR *
-
- #define SW_SHOWNOACTIVATE 4
-
- HANDLE FAR pascal WinExec(LPSTR, INT);
-
- ROUT rout;
- WZFUNC LaunchIndependent(PVAL pret, PVAL parg);
-
- static PCHAR p2ccopy(LPSTR pstr, PCHAR cstr);
-
- WZMAINFUNC main()
-
- {
- rout.nrout = numfuncs;
- rout.exitfunc = 0;
-
- rout.relts[0].pfunc = LaunchIndependent;
- rout.relts[0].name = "\3app";
- rout.relts[0].narg = 2;
-
- return(&rout);
- }
-
- INT drive;
- INT drives;
- INT new;
- CHAR szPath[67];
- LPSTR lp;
- PCHAR p;
- HANDLE hInst;
- CHAR buf[260];
-
- WZFUNC LaunchIndependent(PVAL pret, PVAL parg)
-
- {
- pret->flag = ERR; // default error
- pret->val.err = 12; // Argument is bad
-
- if (parg[0].flag != STRING)
- return;
-
- if (*(lp = parg[1].val.string))
- {
- _dos_getdrive(&drive);
-
- if (!getcwd(szPath, sizeof(szPath) - 1))
- return;
-
- p = p2ccopy(lp, buf);
-
- if (p[1] == ':')
- {
- _dos_setdrive(p[0] & 31, &drives);
- _dos_getdrive(&new);
-
- if (new != (p[0] & 31))
- return;
-
- p += 2;
- }
-
- if (*p && chdir(p) < 0)
- goto CleanUp;
- }
-
- if ((hInst = WinExec(p2ccopy(parg->val.string, buf), SW_SHOWNOACTIVATE)) > 32)
- {
- pret->flag = NUMERIC;
- pret->val.numeric = hInst;
- }
-
- CleanUp:
-
- if (*parg[1].val.string)
- {
- _dos_setdrive(drive, &drives);
- _dos_getdrive(&new);
-
- if (new == drive)
- chdir(szPath);
- }
- }
-
- static PCHAR p2ccopy (LPSTR pstr, PCHAR cstr)
-
- {
- INT count;
- LPSTR src;
- PCHAR dst;
-
- dst = cstr;
-
- if (pstr)
- {
- for (src = pstr + 1, count = pstr[0]; count; count--)
- *dst++ = *src++;
- }
-
- *dst = 0;
-
- return (cstr);
- }