APPUTIL.TXT
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:12k
源码类别:

Windows编程

开发平台:

Visual C++

  1. APPUTIL - Application Utility Library
  2. SUMMARY
  3. =======
  4. The APPUTIL library provides utility classes and functions that are
  5. useful for making simple C++ Win32 Windows applications. APPUTIL is
  6. provided as part of the Win32 OLE Tutorial code samples.
  7. For functional descriptions and a tutorial code tour of APPUTIL, see
  8. the Code Tour section below.
  9. For details on setting up your system to build and test the code samples
  10. in this OLE Tutorial series, see TUTORIAL.TXT. The supplied MAKEFILE is
  11. Microsoft NMAKE-compatible. To create a debug build, issue the NMAKE
  12. command in the Command Prompt window.
  13. Usage
  14. -----
  15. APPUTIL.LIB is meant to be statically linked to modules (.EXEs or .DLLs)
  16. that use it. You include APPUTIL.H in the module that uses features of
  17. APPUTIL.LIB. You must also include APPUTIL.LIB in the LINK command of
  18. your application's makefile. For an example of the use of APPUTIL.LIB,
  19. see the EXESKEL code sample.
  20. Classes
  21. -------
  22. The classes provided are: CVirWindow, CVirDialog, CAboutBox, CMsgBox,
  23. CMsgLog, CSendLog, and CThreaded.
  24. Functions
  25. ---------
  26. The functions provided are: WindowProc, DialogProc, UcToAnsi,
  27. CreateColorScalePalette, PaintWindow, FileExist, MakeFamilyPath, CmdExec,
  28. ReadMe, ReadMeFile, ReadSource, and OutputDebugFmt.
  29. There are also a series of A_ ANSII versions of OLE service helper
  30. functions. The A_ functions are used in conjunction with a matching
  31. series of macros in APPUTIL.H to permit compilation of the code samples
  32. under both ANSII (default) and UNICODE. These macros and matching
  33. A_ functions are for OLE service calls that only accept Unicode string
  34. parameters. For example, the standard OLE StgIsStorageFile function
  35. only accepts a Unicode string. When compiling a sample for ANSII
  36. (ie, UNICODE is not defined), a macro substitutes any StgIsStorageFile
  37. calls into A_StgIsStorageFile calls. A_StgIsStorageFile is implemented
  38. here in APPUTIL. A_StgIsStorageFile takes the input ANSII string
  39. that is passed and converts it into a Unicode string prior to making a
  40. call to the actual OLE StgIsStorageFile function.
  41. CODE TOUR
  42. =========
  43. File          Description
  44. APPUTIL.TXT   This file.
  45. MAKEFILE      The generic Win32 makefile for this APPUTIL library.
  46. APPUTIL.H     The include file for the APPUTIL library. Contains the
  47.               class declarations and function prototypes.
  48. APPUTIL.CPP   The main implementation file for APPUTIL.
  49. An abstract base class, CVirWindow, is declared in APPUTIL.H as an aid in
  50. treating a window as a C++ object. Using the CVirWindow class, a window
  51. procedure can directly access class members by dereferencing a pointer to
  52. an object instance of this class. Through GWL_USERDATA in GetWindowLong
  53. and SetWindowLong, the WindowProc member function has access to the "this"
  54. pointer. The global WindowProc function is still used, but this scheme
  55. allows the global function to forward most message handling to the
  56. WindowProc member function of a specific object instance of CVirWindow.
  57. The global WindowProc receives the "this" pointer as the lpCreateParams
  58. member passed as part of the WM_NCCREATE message. It save the "this"
  59. pointer in the GWL_USERDATA field of the window structure.
  60. An abstract base class, CVirDialog, which is similar to CVirWindow, is
  61. also declared as an aid in treating a dialog box as a C++ object. Using
  62. the CVirDialog class, a dialog box procedure can directly access class
  63. members by dereferencing a pointer to an object instance of this class.
  64. Through GWL_USERDATA in GetWindowLong and SetWindowLong, the DialogProc
  65. member function has access to the "this" pointer. The global DialogProc
  66. function is still used, but this scheme allows the global function to
  67. defer most message handling to the DialogProc member function of a
  68. specific object instance of CVirDialog.  The functionality is very
  69. similar to CVirWindow described above.
  70. The CAboutBox class is declared to allow creation of a common About dialog
  71. box in applications. The class is derived from the CVirDialog abstract
  72. class and illustrates its use.
  73. The CMsgBox class is declared to provide simple message boxes to display
  74. error and notice messages. The message strings in the message box can be
  75. specified as string literals, string variables, or resource string
  76. identifiers. The Error and Note methods take string literals or string
  77. variables. The ErrorID and NoteID methods take resource string identifiers.
  78. In addition, the Notice message box methods have variants that support
  79. message string formatting in the style of the C standard library function
  80. printf. These member functions support a variable argument list, NoteFmt,
  81. and NoteFmtID.
  82. The CMsgLog class is declared to provide a facility for logging debug trace
  83. messages to a Listbox control. This class is for code samples that use
  84. debug messages to announce internal activity in the code being studied.
  85. This message log listbox can be directed to occupy the entire client area
  86. of the parent window. An argument to the Create method determines whether
  87. the log occupies a detached child window or the entire client area as an
  88. integral child window. Message output member functions can use either
  89. string resource identifier arguments to retrieve the message strings from
  90. the application's resources, or string variables to retrieve the message
  91. strings directly. The CMsgLog::MsgFmt method is provided to allow message
  92. formatting in the style of the C standard library function wsprintf. This
  93. member function supports a variable argument list. The CMsgLog::Copy method
  94. is provided to copy the entire contents of the message log to the Windows
  95. Clipboard.
  96. The CMsgLog logging facility is for examining the tutorial code samples.
  97. It works in parallel with the standard OutputDebugString capability. If
  98. you are compiling with NODEBUG=1, the debug output is not compiled. In this
  99. case, logging support is still available, because it is an integral part
  100. of the code sample itself. When compiling for debugging, both outputs are
  101. provided for flexibility. Most C++ debuggers have an output window that
  102. will display the debug output strings, but the logging facility works
  103. whether or not you are running the application under a debugger.
  104. The CSendLog trace logging facility is also provided. It operates much like
  105. the CMsgLog facility, except that it is intended for an application that
  106. logs its activity in an application running in another process. This
  107. facility is useful in an out-of-process local server that logs its
  108. internal behavior to a display in a client .EXE. CSendLog uses the Win32
  109. SendMessage function with the WM_COPYDATA message to send a block of text
  110. data from one process to another. CSendLog duplicates some of the
  111. capability of CMsgLog by allowing a local server to have its own log
  112. display. The destination of the logging can therefore be switched between
  113. the client's logging display and the local server's logging display by
  114. calling the LogToServer method.
  115. The CThreaded class is provided as a utility base class for providing
  116. functionality in derived classes that offer mutually exclusive access
  117. among multiple threads to data in objects of the derived class. Derive
  118. your class from CThreaded to inherit these features. A typical example of
  119. a method in the derived class that exploits these features follows.
  120.   void CServer::Unlock(void)
  121.   {
  122.     if (OwnThis())
  123.     {
  124.       m_cLocks -= 1;
  125.       if (m_cLocks < 0)
  126.         m_cLocks = 0;
  127.       if (0L == m_cObjects && 0L == m_cLocks && IsWindow(m_hWndServer))
  128.         PostMessage(m_hWndServer, WM_CLOSE, 0, 0L);
  129.       UnOwnThis();
  130.     }
  131.     return;
  132.   }
  133. This Unlock method implements numerous thread-safe accesses and changes to
  134. the guarded m_cLocks member variable. CServer was derived public from
  135. CThreaded. Two CThreaded methods are of value here: OwnThis and UnOwnThis
  136. are virtual functions in CThreaded that have default defintions that
  137. enforce mutually exclusive access to data in objects of the derived class
  138. (like CServer here). You use bracketed pairs of these OwnThis and
  139. UnOwnThis methods, as above, to code the protection. OwnThis blocks the
  140. currently executing thread until any currently "owning" threads execute
  141. the UnOwnThis method. OwnThis returns true if ownership is granted. See
  142. the CThreaded method definitions in APPUTIL.CPP for more details.
  143. Some general utility functions and macros provided by APPUTIL are
  144. briefly described below.
  145. OLE often deals with parameters that are pointers to pointers (void**).
  146. To capture this as a type, a PPVOID typedef is provided.
  147. The DELETE_POINTER macro deletes the object pointed to by a pointer and sets
  148. the pointer to NULL.
  149. The RELEASE_INTERFACE macro releases a pointer to an interface and sets the
  150. pointer to NULL.
  151. lRandom is a simple DWORD pseudo-random number generator.
  152. Two utility functions are provided for creating color scale palettes and
  153. for painting windows with such colors: CreateColorScalePalette and
  154. PaintWindow. Lifted from the GDIDEMO sample in the Win32 samples of the
  155. Win32 SDK. They are used in these tutorial samples to add color background
  156. to the standard Aboutbox dialog.
  157. The FileExist utility function indicates whether a specified file exists.
  158. The MakeFamilyPath utility function uses GetModuleFileName to dynamically
  159. determine the path to the module currently executing and construct a
  160. "family" variant of that path with the proper file name extension for a
  161. particular purpose. Various such extensions (for example, .HLP, .TXT, and
  162. .LIC) are defined in APPUTIL.H for use with this MakeFamilyPath function.
  163. The ReadMe utility function is provided to start a reader on the
  164. <sample>.TXT file that accompanies the current executable. The Windows
  165. Notepad (NOTEPAD.EXE) is the default reader. You can specify a different
  166. reader by modifying EDITOR_FILE_STR in APPUTIL.H.
  167. Like ReadMe, the ReadMeFile utility function is provided to start a reader
  168. on a specified <sample>.TXT file.
  169. The ReadSource utility function is provided to display the Open common
  170. dialog box so the user can select any of the source files for the current
  171. code sample and start a reader on that file. The Windows Notepad
  172. (NOTEPAD.EXE) is the default reader. You can specify a different reader by
  173. modifying EDITOR_FILE_STR in APPUTIL.H
  174. Then OutputDebugFmt utility function is provided to support formatted
  175. (printf-style) variable argument output to the debugger. This function
  176. wraps the standard OutputDebugString function.
  177. A set of debug output macros is provided to obtain source file and line
  178. number information for the debug output. These macros use the function
  179. OutputDebugFmt to support variable argument lists in the format
  180. of the debug output display string. The debug output macros are:
  181. Macro Description
  182. ODS   Output debug string literal.
  183.       Example:  ODS("String Literal").
  184. ODFn  Output formatted debug string using printf-style format string
  185.       and a variable argument list to correspond to the format.
  186.       Examples: ODF1("Integer=%i", iInteger);
  187.                 ODF2("Integer=%i String=%s rn", iInteger, szString);
  188. A set of debug trace logging macros is provided to obtain source file and
  189. line number information for the debug output while also logging these
  190. messages to a built-in CMsgLog message logging facility in the
  191. application. These macros also output the same messages to the debugger
  192. using the standard OutputDebugString call. These are convenience macros to
  193. perform both the message logging that the application requires and to
  194. output the same messages to the debugger, if the application was compiled
  195. for debugging and you are running it under a debugger aware of such
  196. output. Like the ODFn macros, these macros form a series. For the string
  197. literal arguments, do not use the TEXT macro--it is provided inside
  198. the macro.
  199. Macro     Description
  200. LOG       Log a string literal message.
  201.           Example: LOG("String Literal");
  202. LOGFn     Log a formatted message using printf-style format string
  203.           and a variable argument list to correspond to the format.
  204.           Examples: LOGF1("Integer=%i", iInteger);
  205.                     LOGF2("Integer=%i String=%s rn", iInteger, szString);
  206. LOGID     Log a message string retrieved from the module's resources.
  207.           Example:  LOGID(ID_OF_MY_STRING_IN_THE_RESOURCES);
  208. LOGERROR  Check an error code and if it is an error then fetch the matching
  209.           error string message from the system tables and log the error.
  210.           Example: LOGERROR("SysApiThatWasCalled:", ErrorCodeReturned);