/***************************************************************************** Replacement WINSTUB.EXE for windows apps. This stub will start windows and the application simply by typing the application's name at the DOS prompt. It will also output a message to your users when they close down windows. The message is pointed to by 'glprnpszExit', appended to the end of this string is the name of the app in lower case with the first character in upper case. pr = private au = auto st = static bl = block gl = global fi = pr = file compile and link line - uses C6 W4 and either real or implict real lib. cl -AS -W[4,3] -c stub.c link stub,,,slibce[r],nul written by Peter Morris. Compuserve ID 100016,2751 *****************************************************************************/ #include #include #include #include #include #define private static #define SPACE (char)0x0020 /* hex for ASCII space char */ void *vpZmalloc(int); char *npsAddString(char *,char const * const,int); char *npszAddNULL(char *pString); void vStartWinAndApp(char const * const,char const * const); char const * const npszAppNameFirstUpper(char * const); int main(int,char **); private char const * const glprnpszTrying="Trying to start Windows and"; private char const * const glprnpszWindows="WIN"; private char *glprnpszExitString="Next time remember to run Windows " "before running"; /***************************************************************************** malloc memory 'space' initialised. *****************************************************************************/ void *vpZmalloc(int aublnNumbytes) { auto void *aublvpMem; aublvpMem=(void *)malloc(aublnNumbytes); memset(aublvpMem,SPACE,aublnNumbytes); return aublvpMem; } /***************************************************************************** adds a string pointed to by npsSourceString to a buufer pointed to by npsDest, copies nSourceLength bytes over then returns the pointer npsDest incremented so as to point over a space character *****************************************************************************/ char *npsAddString(char *npsDest,char const * const npsSourceString,int nSourceLength) { strncpy(npsDest,npsSourceString,nSourceLength); npsDest+=strlen(npsSourceString); return ++npsDest; } /***************************************************************************** NULL terminates a string. char to set to null is given in npsString-1 *****************************************************************************/ char *npszAddNULL(char *npsString) { *(npsString-1)=(char)'\0'; return npsString; } /***************************************************************************** starts windows and the app, this is pointed to by npszAppString and we use a system call to do it. if this fails we call frintf() to report the error else we call, when windows has shut down, fprintf with a message saying what ever you like *****************************************************************************/ void vStartWinandApp(char const * const npszAppString,char const * const npszArg0) { auto char const * const aublszString=npszAppNameFirstUpper((char * const)npszArg0); fprintf(stdout,"%s %s\n\n",glprnpszTrying,aublszString); if(system(npszAppString)!=0) fprintf(stderr,"Error executing - %s, errno=%d\n",npszAppString,errno); else fprintf(stdout,"%s %s",glprnpszExitString,aublszString); } /***************************************************************************** capitalises the first char of our app's name and returns a pointer to it *****************************************************************************/ char const * const npszAppNameFirstUpper(char * const npszAppName) { auto char *aublnpszString; aublnpszString=strrchr(npszAppName,(int)'\\'); aublnpszString++; strlwr(aublnpszString); *aublnpszString=(char)toascii((int)*aublnpszString); *aublnpszString=(char)toupper((int)*aublnpszString); return aublnpszString; } /***************************************************************************** main - works out how much memory is in the argv array of char pointers as strings plus 'WIN' plus all the spaces and a NULL terminator. calls vpZmalloc to allocate the memory then adds the strings 'WIN' and argv strings to it. adds a null to the end of it and uuper cases it than causes windows to start with the app and arguments passed in lpszCmdLine to the windows app. finally it frees the memory. *****************************************************************************/ int main(int argc,char **argv) { auto int aublnStrlen; auto int aublnLoop; auto void *aublvpMem; auto char *aublnpszChar; for(aublnLoop=aublnStrlen=0;aublnLoop