home *** CD-ROM | disk | FTP | other *** search
/ HomeWare 14 / HOMEWARE14.bin / windows / utils / wwlaunch.arj / LAUNCHER.C < prev    next >
C/C++ Source or Header  |  1994-03-17  |  7KB  |  203 lines

  1. /* file: launcher.c */
  2. /*********************************************************************\
  3.  *                                                                   *
  4.  * Simple program launcher for windows.  The single argument is a    *
  5.  * filename which contains a list of zero or more programs to run.   *
  6.  * The mapping between program name and executable name is in the    *
  7.  * profile (.ini)                                                    *
  8.  *                                                                   *
  9. \*********************************************************************/ 
  10.  
  11. #include <windows.h>
  12. #include <string.h>
  13. #include <stdio.h>
  14. #include <ctype.h>
  15. #include <commdlg.h>
  16. #include <dlgs.h>
  17.  
  18. /* define strings for .ini file */
  19. #define SECTION "Mappings"
  20. #define PROFILE "launcher.ini"
  21.  
  22. /* comment out the following for internal library version */
  23. /* #define REMOTE_CONFIG 1  */
  24.  
  25. /* name of the help file */
  26. #define HELPFILE "launcher.hlp"
  27.  
  28. /* forward references */
  29. UINT CALLBACK OpenFileHook(HWND,UINT,WPARAM,LPARAM);
  30. int GetParams(HFILE,char *, int, char *, int, int *); 
  31.  
  32. /* entry point */
  33. int PASCAL WinMain(HANDLE hInstance, HANDLE hPrevInstance,
  34.                    LPSTR CmdLine, int nCmdShow)
  35. {
  36.   
  37.   HFILE hFile;
  38.   char keyword[512];
  39.   char params[512];
  40.   char PgmPath[512];
  41.   char cmd[512];
  42.   int cflag;
  43. #ifdef REMOTE_CONFIG
  44.   OPENFILENAME openfn;
  45. #endif  
  46.   UINT retval;
  47.   
  48.   /* open the file named on the command line */
  49.   hFile = _lopen(CmdLine,READ);
  50.   if (hFile == HFILE_ERROR) return(0);          /* quietly bomb on error */
  51.   
  52.   /* loop read, map/configure and launching applications */
  53.   while(GetParams(hFile,keyword,sizeof(keyword),
  54.                   params,sizeof(params),&cflag) != -1) {
  55.    
  56.    /* check for empty keyword */
  57.    if (*keyword == '\0') continue;
  58.    
  59.    /* is this a request to launch or configure? */
  60.    if (cflag) {
  61. #ifdef REMOTE_CONFIG
  62.     memset(&openfn,0,sizeof(OPENFILENAME));     /* clear the structure */
  63.     openfn.lStructSize = sizeof(OPENFILENAME);  /* set the required fields */
  64.     openfn.hwndOwner = NULL;
  65.   
  66.     /* go get the filename */ 
  67.     PgmPath[0] = '\0';
  68.     openfn.hInstance = hInstance;
  69.     (FARPROC) (openfn.lpfnHook) = 
  70.       MakeProcInstance((FARPROC) OpenFileHook,hInstance);
  71.     openfn.lpstrFilter = 
  72.        "Programs (*.exe)\000*.exe\000Batch Files (*.bat)\000\
  73. *.bat\000DOS applications (*.PIF)\000*.pif\000All files (*.*)\000*.*\000";
  74.     openfn.lpstrFile = PgmPath;
  75.     openfn.nMaxFile = sizeof(PgmPath);
  76.     openfn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST | 
  77.                    OFN_FILEMUSTEXIST | OFN_ENABLEHOOK;
  78.     if (!(GetOpenFileName(&openfn))) {
  79.      FreeProcInstance((FARPROC) openfn.lpfnHook);
  80.      return(1);
  81.     }
  82.     FreeProcInstance((FARPROC) openfn.lpfnHook);
  83.     
  84.     /* write the entry in the .ini file */
  85.     WritePrivateProfileString(SECTION,keyword,PgmPath,PROFILE);
  86. #else
  87.     MessageBox(NULL,"Can't re-configure this internal library machine.",
  88.                     "Launcher Configure Error",MB_ICONSTOP);
  89. #endif
  90.    }
  91.    
  92.    /* otherwise, launch the program */
  93.    else {
  94.     GetPrivateProfileString(SECTION,keyword,"~",
  95.                             PgmPath,sizeof(PgmPath),PROFILE);
  96.     if (*PgmPath != '~') {
  97.      sprintf(cmd,"%s %s",PgmPath,params);
  98.      if((retval = WinExec(cmd,SW_SHOW)) < 32) {
  99.       sprintf(keyword,"Error launching: %s (code=%d)",PgmPath,retval);
  100.       MessageBox(NULL,keyword,"Launcher Error",MB_ICONSTOP);
  101.       return(101);
  102.      }
  103.     }
  104.     else {
  105.      MessageBox(NULL,"Unknown application. Make sure the launcher\
  106.  configuration is correct.","Launcher Configure Error",MB_ICONSTOP);
  107.      return(101);
  108.     }
  109.    }   
  110.   }
  111.   
  112.   /* all done */
  113.   return(100);
  114. }  
  115.  
  116. /* gets the parameters from the next line in the input file, returns */
  117. /* -1 at end of file */
  118. int GetParams(HFILE hFile,char *keyword,int klen,
  119.               char *params,int plen,int *cflag) 
  120.   register i;
  121.   
  122.   /* scan off leading whitespace, get one byte at a time */
  123.   for(*cflag=FALSE,i=0,klen--; i < klen;) {
  124.    if (_lread(hFile,keyword+i,1) == 0) { 
  125.     if (i == 0) return(-1);
  126.     *(keyword+i) = '\0';              /* EOF and we got some chars */
  127.     return(0);
  128.    }
  129.    if (*(keyword+i) == '\n' || *(keyword+i) == '\r') {
  130.     *(keyword+i) = '\0';              /* terminate and return */
  131.     return(0);
  132.    }
  133.    if (isspace(*(keyword+i))) {       /* whitespace? */
  134.     if (i != 0) break;                /* end of keyword */
  135.    }
  136.    else {
  137.     i++;                              /* advance the index */
  138.    }
  139.   }
  140.   *(keyword+i) = '\0';                /* terminate the string */
  141.   
  142.   /* if this is configure, set configure flag and read keyword */
  143.   if (strcmp("configure",keyword) == 0) {
  144.    *cflag = TRUE;                     /* set configure flag */
  145.    for(i=0,klen--; i < klen;) {
  146.     if (_lread(hFile,keyword+i,1) == 0) { 
  147.      if (i == 0) return(-1);
  148.      *(keyword+i) = '\0';             /* EOF and we got some chars */
  149.      return(0);
  150.     }
  151.     if (*(keyword+i) == '\n' || *(keyword+i) == '\r') {
  152.      *(keyword+i) = '\0';             /* terminate and return */
  153.      return(0);
  154.     }
  155.     if (isspace(*(keyword+i))) {      /* whitespace? */
  156.      if (i != 0) break;               /* end of keyword */
  157.     }
  158.     else {
  159.      i++;                             /* advance the index */
  160.     }
  161.    }
  162.    *(keyword+i) = '\0';               /* terminate the string */
  163.   }
  164.  
  165.   /* now get the rest of the command line */
  166.   for(i=0,plen--; i < plen; i++) {
  167.    if (_lread(hFile,params+i,1) == 0) break; 
  168.    if (*(params+i) == '\n' || *(params+i) == '\r') break;
  169.   }
  170.   *(params+i) = '\0';                 /* terminate the string */
  171.   
  172.   /* all done */
  173.   return(0);
  174. }
  175.  
  176. /* openfile hook procedure */
  177. UINT CALLBACK _export OpenFileHook(HWND hwnd, UINT message,
  178.                                    WPARAM wParam, LPARAM lParam)
  179. {
  180.   int code;
  181.     
  182.   /* process the message, return TRUE if we handle the message */
  183.   switch(message) {
  184.    case WM_INITDIALOG:
  185.         SetWindowText(hwnd,"Locate the program to launch");
  186.         return(FALSE);
  187.         
  188.    case WM_COMMAND:
  189. #ifdef WIN32
  190.         code = LOWORD(wParam);
  191. #else
  192.         code = wParam;
  193. #endif
  194.         switch(code) {
  195.          case pshHelp:
  196.               WinHelp(hwnd,HELPFILE,HELP_CONTEXT,(DWORD) 1);
  197.               return(TRUE);
  198.         }
  199.   }
  200.   return(FALSE);
  201. }
  202.