Visual Basic

The Logger Code

As promised, Listing 7-2 shows the C source code for the spy type application we used earlier on the command line arguments of both C2.EXE and LINK.EXE. Note that a nearly equivalent Visual Basic version follows this application.

Listing 7-2 The OUTARGS logger application in C

  /*******************************************************
  Small 'C' applet used to replace Visual Basic 6 compiler
  apps so as to gather their output and manipulate their
  command-line switches.
  See notes in main text for more details.
  *******************************************************/
  #include < stdio.h   >
  #include < string.h  >
  #include < time.h    >
  #include < windows.h >
  int main
  (
      int    argc     // Number of command-line arguments.
     ,char * argv[]   // The arguments themselves.
     ,char * env []   // Environment variables.
  )
  {
      /**************************************
      ** General declares.
      */
      #define BUFF 2048
      auto FILE *      stream;        // File to write to.
      auto struct tm * tt;            // Time stuff for time of write.
      auto time_t      t;             // ----- " " -----
      auto char        carBuff[255];  // Used for holding output
                                      // file name.
      auto char        carArgs[BUFF]; // Holds command line args
                                      // for display.
      auto int         nLoop;         // Loop counter.
      /* ***************
      ** Code starts ...
      */
      // Change according to what real (renamed) application you
      // want to start.
      (void)strcpy(&carArgs[0], ".\\C3 ");
      // Get the system time and convert it to ASCII string.
      (void)time(&t);
      tt = localtime(&t);
      // Going to need to append to our exe name, so write
      // to temp buffer.
      (void)strcpy(&carBuff[0], argv[0]);
      // Now append .OUT - should contain ???.OUT after this where ???
      // could be APP.EXE or just APP, depending upon how this program
      // is run.
      (void)strcat(&carBuff[0], ".OUT");
      // Write to EXEName.OUT file (append mode)...
      if (NULL != (stream = fopen(&carBuff[0], "a")))
      {
          // Write out the time.
          (void)fprintf(stream, "********** Run @ %s\n", asctime(tt));
          // Output name of EXE file.
          (void)fprintf(stream, "* EXE file...\n\n");
          (void)fprintf(stream, "\t%s\n", argv[0]);
          /* *****************************************************
          ** Output command line args (exclude our exe name argv[0]).
          */
          (void)fprintf(stream, "\n* Command Line Arguments...\n\n");
          for (nLoop = 1; nLoop < argc; nLoop++)
          {
              (void)fprintf(stream,"%d\t%s\n", nLoop, argv[nLoop]);
              // Append to args buffer.
              (void)strcat(&carArgs[0]   , argv[nLoop]);
              (void)strcat(&carArgs[0]   , " ");
          }
          /* *****************************
          ** Output environment variables.
          */
          (void)fprintf(stream, "\n* Environment Variables...\n\n");
          for (nLoop = 0; NULL != env[nLoop]; nLoop++)
          {
            (void)fprintf(stream, "%d\t%s\n", nLoop, env[nLoop]);
          }
          /* ***************************************************
          ** Output name and args of other application to start.
          */
          (void)fprintf(stream, "\n* 'Real' program and arguments...\n\n");
          (void)fprintf(stream, "\t%s\n", &carArgs[0]);
          (void)fprintf(stream, "\n********** Run End\n\n\n");
          // All done so tidy up.
          (void)fclose(stream);
          (void)WinExec(&carArgs[0], 1);
      }
      return 0;
  }

And the (nearly) equivalent Visual Basic application in Listing 7-3:

Listing 7-3 The OUTARGS logger application in Visual Basic

  Sub Main()
      If 0 <> Len(Command$) Then
          Dim sRealAppName As String
          sRealAppName = GetSetting(App.EXEName, "Startup", _
                                    "RealAppName", "")
          If 0 <> Len(sRealAppName) Then
              Call Shell(sRealAppName & " " & Command$, vbHide)
              Dim nFile As Integer
              nFile = FreeFile
              Open App.EXEName & ".out" For Append Access Write As nFile
              Print #nFile, "****** Run at " & _
                            Format$(Date, "Short date") & _
                            " " & Format$(Time, "Long Time")
              Print #nFile, sRealAppName & " " & Command$
              Close nFile
          End If
      End If
  End Sub

Stuff About Optimization

This section deals with how to best optimize your applications. Notice that the word "code" didn't appear in the preceding sentence. To correctly optimize the way we work and the speed with which we can ship products and solutions, we need to look beyond the code itself. In the following pages, I'll describe what I think are the most effective ways to optimize applications.