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.