OS_main.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file   OS_main.h
00006  *
00007  *  OS_main.h,v 1.15 2006/05/30 13:15:25 schmidt Exp
00008  *
00009  *  @author Douglas C. Schmidt <schmidt@cs.wustl.edu>
00010  *  @author Jesper S. M|ller<stophph@diku.dk>
00011  *  @author and a cast of thousands...
00012  *
00013  *  Originally in OS.h.
00014  */
00015 //=============================================================================
00016 
00017 #include "ace/ACE_export.h"
00018 
00019 #ifndef ACE_OS_MAIN_H
00020 # define ACE_OS_MAIN_H
00021 
00022 # include /**/ "ace/pre.h"
00023 
00024 # if !defined (ACE_LACKS_PRAGMA_ONCE)
00025 #  pragma once
00026 # endif /* ACE_LACKS_PRAGMA_ONCE */
00027 
00028 # if !defined (ACE_MAIN)
00029 #   define ACE_MAIN main
00030 # endif /* ! ACE_MAIN */
00031 
00032 # if !defined (ACE_WMAIN)
00033 #   define ACE_WMAIN wmain
00034 # endif /* ! ACE_WMAIN */
00035 
00036 # if defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00037 #   define ACE_TMAIN wmain
00038 # else
00039 #   if defined (ACE_USES_WCHAR)    /* Not Win32, but uses wchar */
00040       // Replace main() with a version that converts the char** argv to
00041       // ACE_TCHAR and calls the ACE_TMAIN entrypoint.
00042 #     include "ace/Argv_Type_Converter.h"
00043 #     define ACE_TMAIN \
00044         ace_main_i (int, ACE_TCHAR *[]); /* forward declaration */ \
00045         int main (int argc, char *argv[]) { \
00046           ACE_Argv_Type_Converter wide_argv (argc, argv); \
00047           return ace_main_i (argc, wide_argv.get_TCHAR_argv ()); \
00048         } \
00049         int ace_main_i
00050 #   else
00051 #     define ACE_TMAIN main
00052 #   endif /* ACE_USES_WCHAR */
00053 # endif
00054 
00055 # if defined (ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER)
00056 #   if !defined (ACE_HAS_NONSTATIC_OBJECT_MANAGER)
00057 #     define ACE_HAS_NONSTATIC_OBJECT_MANAGER
00058 #   endif /* ACE_HAS_NONSTATIC_OBJECT_MANAGER */
00059 # endif /* ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER */
00060 
00061 # if defined (ACE_HAS_NONSTATIC_OBJECT_MANAGER) \
00062        && !defined (ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER)
00063 
00064 // Rename "main ()" on platforms that don't allow it to be called "main ()".
00065 
00066 #   if defined (ACE_VXWORKS) && !defined (__RTP__)
00067 
00068 typedef int (*ace_main_proc_ptr)(int, char *[]);
00069 
00070 extern ace_main_proc_ptr vx_ace_main_i_ptr;
00071 
00072 #     define main \
00073 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00074 ace_os_main_i (int, char *[]); \
00075 ACE_END_VERSIONED_NAMESPACE_DECL \
00076 int ace_main_i(int, char *[]); \
00077 int \
00078 ACE_MAIN (int argc, char *argv[])    /* user's entry point, e.g., main */ \
00079 { \
00080   vx_ace_main_i_ptr = ace_main_i; \
00081   return ace_os_main_i (argc, argv); /* what the user calls "main" */ \
00082 } \
00083 int \
00084 ace_main_i
00085 
00086 #   elif !defined (ACE_WIN32)
00087 
00088 #     define main \
00089 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00090 ace_os_main_i (int, char *[]); \
00091 ACE_END_VERSIONED_NAMESPACE_DECL \
00092 int \
00093 ACE_MAIN (int argc, char *argv[])    /* user's entry point, e.g., main */ \
00094 { \
00095   return ace_os_main_i (argc, argv); /* what the user calls "main" */ \
00096 } \
00097 int \
00098 ace_main_i
00099 
00100 #   elif !defined (ACE_HAS_WINCE)
00101 
00102 #     if defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00103 
00104 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00105 
00106 class ACE_Export ACE_Main_Base
00107 {
00108 public:
00109   int run (int, ACE_TCHAR *[]);
00110   virtual int run_i (int, ACE_TCHAR *[]) = 0;
00111 };
00112 
00113 ACE_END_VERSIONED_NAMESPACE_DECL
00114 
00115 #       define wmain \
00116 ace_wmain_i (int, ACE_TCHAR *[]); \
00117 ACE_Export int ace_os_wmain_i (ACE_Main_Base&, int, ACE_TCHAR *[]); \
00118 class ACE_Main : public ACE_Main_Base {int run_i (int, ACE_TCHAR *[]);}; \
00119 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00120 { \
00121   return ace_wmain_i (argc, argv); \
00122 } \
00123 int \
00124 ACE_WMAIN (int argc, ACE_TCHAR *argv[]) /* user's entry point, e.g., wmain */ \
00125 { \
00126   ACE_Main m; \
00127   return ace_os_wmain_i (m, argc, argv);   /* what the user calls "main" */ \
00128 } \
00129 int \
00130 ace_wmain_i
00131 
00132 #     else /* ! (ACE_WIN32 && ACE_USES_WCHAR) */
00133 
00134 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00135 
00136 class ACE_Export ACE_Main_Base
00137 {
00138 public:
00139   int run (int, char *[]);
00140   virtual int run_i (int, char *[]) = 0;
00141 };
00142 
00143 ACE_END_VERSIONED_NAMESPACE_DECL
00144 
00145 #       define main \
00146 ace_main_i (int, char *[]); \
00147 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00148 ACE_Export int ace_os_main_i (ACE_Main_Base&, int, char *[]); \
00149 class ACE_Main : public ACE_Main_Base {int run_i (int, char *[]);}; \
00150 inline int ACE_Main::run_i (int argc, char *argv[])  \
00151 { \
00152   return ace_main_i (argc, argv); \
00153 } \
00154 ACE_END_VERSIONED_NAMESPACE_DECL \
00155 int \
00156 ACE_MAIN (int argc, char *argv[]) /* user's entry point, e.g., wmain */ \
00157 { \
00158   ACE_Main m; \
00159   return ace_os_main_i (m, argc, argv);   /* what the user calls "main" */ \
00160 } \
00161 int \
00162 ace_main_i
00163 
00164 #     endif /* ACE_WIN32 && ACE_USES_WCHAR */
00165 
00166 #   else /* ACE_HAS_WINCE */
00167 
00168 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00169 
00170 class ACE_Export ACE_Main_Base
00171 {
00172 public:
00173   int run (HINSTANCE, HINSTANCE, LPWSTR, int);
00174   virtual int run_i (int, ACE_TCHAR *[]) = 0;
00175 };
00176 
00177 ACE_END_VERSIONED_NAMESPACE_DECL
00178 
00179 #     if defined (ACE_TMAIN)  // Use WinMain on CE; others give warning/error.
00180 #       undef ACE_TMAIN
00181 #     endif  // ACE_TMAIN
00182 
00183 // Support for ACE_TMAIN, which is a recommended way. It would be nice if
00184 // CE had CommandLineToArgvW()... but it's only on NT3.5 and up.
00185 
00186 #     define ACE_TMAIN \
00187 ace_tmain_i (int, ACE_TCHAR *[]); \
00188 class ACE_Main : public ACE_Main_Base {int run_i (int argc, ACE_TCHAR *argv[]);}; \
00189 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00190 { \
00191   return ace_tmain_i (argc, argv); \
00192 } \
00193 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) \
00194 { \
00195   ACE_Main m; \
00196   return m.run (hInstance, hPrevInstance, lpCmdLine, nCmdShow); \
00197 } \
00198 int ace_tmain_i
00199 
00200 // Support for wchar_t but still can't fit to CE because of the command
00201 // line parameters.
00202 #     define wmain \
00203 ace_wmain_i (int, ACE_TCHAR *[]); \
00204 ACE_Export int ace_os_winwmain_i (ACE_Main_Base&, hInstance, hPrevInstance, lpCmdLine, nCmdShow);  /* forward declaration */ \
00205 class ACE_Main : public ACE_Main_Base {int run_i (int argc, ACE_TCHAR *argv[]);}; \
00206 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00207 { \
00208   return ace_wmain_i (argc, argv); \
00209 } \
00210 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) \
00211 { \
00212   return ace_os_winwmain_i (hInstance, hPrevInstance, lpCmdLine, nCmdShow); \
00213 } \
00214 int ace_wmain_i
00215 
00216 // Supporting legacy 'main' is A LOT easier for users than changing existing
00217 // code on WinCE. Unfortunately, evc 3 can't grok a #include within the macro
00218 // expansion, so it needs to go out here.
00219 #     include "ace/Argv_Type_Converter.h"
00220 #     define main \
00221 ace_main_i (int, ACE_TCHAR *[]); \
00222 ACE_Export int ace_os_winmain_i (ACE_Main_Base&, hInstance, hPrevInstance, lpCmdLine, nCmdShow);  /* forward declaration */ \
00223 class ACE_Main : public ACE_Main_Base {int run_i (int argc, ACE_TCHAR *argv[]);}; \
00224 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00225 { \
00226   return ace_main_i (argc, argv); \
00227 } \
00228 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) \
00229 { \
00230   return ace_os_winmain_i (hInstance, hPrevInstance, lpCmdLine, nCmdShow); \
00231 } \
00232 int ace_main_i
00233 
00234 #   endif   /* ACE_PSOSIM */
00235 # endif /* ACE_HAS_NONSTATIC_OBJECT_MANAGER && !ACE_HAS_WINCE && !ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER */
00236 
00237 # include /**/ "ace/post.h"
00238 
00239 #endif /* ACE_OS_MAIN_H */

Generated on Thu Nov 9 09:41:57 2006 for ACE by doxygen 1.3.6