OS_main.h

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 
00003 //=============================================================================
00004 /**
00005  *  @file   OS_main.h
00006  *
00007  *  $Id: OS_main.h 80826 2008-03-04 14:51:23Z wotte $
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_HAS_RTEMS)
00029 extern char* rtems_progname;
00030 # endif /* ACE_HAS_RTEMS */
00031 
00032 #if defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x640) && defined (__RTP__)
00033 #  include <resolvLib.h>
00034 #endif
00035 
00036 # if !defined (ACE_MAIN)
00037 #   define ACE_MAIN main
00038 # endif /* ! ACE_MAIN */
00039 
00040 # if !defined (ACE_WMAIN)
00041 #   define ACE_WMAIN wmain
00042 # endif /* ! ACE_WMAIN */
00043 
00044 # if defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00045 #   define ACE_TMAIN wmain
00046 # else
00047 #   if defined (ACE_USES_WCHAR)    /* Not Win32, but uses wchar */
00048       // Replace main() with a version that converts the char** argv to
00049       // ACE_TCHAR and calls the ACE_TMAIN entrypoint.
00050 #     include "ace/Argv_Type_Converter.h"
00051 #     define ACE_TMAIN \
00052         ace_main_i (int, ACE_TCHAR *[]); /* forward declaration */ \
00053         int main (int argc, char *argv[]) { \
00054           ACE_Argv_Type_Converter wide_argv (argc, argv); \
00055           return ace_main_i (argc, wide_argv.get_TCHAR_argv ()); \
00056         } \
00057         int ace_main_i
00058 #   else
00059 #     define ACE_TMAIN main
00060 #   endif /* ACE_USES_WCHAR */
00061 # endif
00062 
00063 # if defined (ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER)
00064 #   if !defined (ACE_HAS_NONSTATIC_OBJECT_MANAGER)
00065 #     define ACE_HAS_NONSTATIC_OBJECT_MANAGER
00066 #   endif /* ACE_HAS_NONSTATIC_OBJECT_MANAGER */
00067 # endif /* ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER */
00068 
00069 # if defined (ACE_HAS_NONSTATIC_OBJECT_MANAGER) \
00070        && !defined (ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER)
00071 
00072 // Rename "main ()" on platforms that don't allow it to be called "main ()".
00073 
00074 #   if defined (ACE_VXWORKS) && !defined (__RTP__)
00075 
00076 typedef int (*ace_main_proc_ptr)(int, char *[]);
00077 
00078 extern ace_main_proc_ptr vx_ace_main_i_ptr;
00079 
00080 // Declare ACE_MAIN as extern C so that it can be retrieved
00081 // using symFindByName
00082 extern "C"
00083 {
00084   int ACE_MAIN (int, char* []);
00085 }
00086 
00087 #     define main \
00088 ACE_MAIN (int, char *[]); /* forward decl to gobble up the 'int' if there is one */ \
00089 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00090 int ace_os_main_i (int, char *[]); \
00091 ACE_END_VERSIONED_NAMESPACE_DECL \
00092 int ace_main_i(int, char *[]); \
00093 int \
00094 ACE_MAIN (int argc, char *argv[])    /* user's entry point, e.g., main */ \
00095 { \
00096   vx_ace_main_i_ptr = ace_main_i; \
00097   return ace_os_main_i (argc, argv); /* what the user calls "main" */ \
00098 } \
00099 int \
00100 ace_main_i
00101 
00102 #   elif defined (ACE_HAS_RTEMS)
00103 
00104 #     define main \
00105 ACE_MAIN (int, char *[]); /* forward decl to gobble up the 'int' if there is one */ \
00106 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00107 int ace_os_main_i (int, char *[]); \
00108 ACE_END_VERSIONED_NAMESPACE_DECL \
00109 int \
00110 ACE_MAIN (int argc, char *argv[])    /* user's entry point, e.g., main */ \
00111 { \
00112   if ((argc > 0) && argv && argv[0]) \
00113     rtems_progname = argv[0]; \
00114   else \
00115     rtems_progname = "RTEMS"; \
00116   return ace_os_main_i (argc, argv); /* what the user calls "main" */ \
00117 } \
00118 int \
00119 ace_main_i
00120 
00121 #   elif defined (ACE_VXWORKS) && (ACE_VXWORKS <= 0x640) && defined (__RTP__)
00122 
00123 #     define main \
00124 ACE_MAIN (int, char *[]); /* forward decl to gobble up the 'int' if there is one */ \
00125 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00126 int ace_os_main_i (int, char *[]); \
00127 ACE_END_VERSIONED_NAMESPACE_DECL \
00128 int \
00129 ACE_MAIN (int argc, char *argv[])    /* user's entry point, e.g., main */ \
00130 { \
00131   resolvInit(); \
00132   return ace_os_main_i (argc, argv); /* what the user calls "main" */ \
00133 } \
00134 int \
00135 ace_main_i
00136 
00137 #   elif !defined (ACE_WIN32)
00138 
00139 #     define main \
00140 ACE_MAIN (int, char *[]); /* forward decl to gobble up the 'int' if there is one */ \
00141 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00142 int ace_os_main_i (int, char *[]); \
00143 ACE_END_VERSIONED_NAMESPACE_DECL \
00144 int \
00145 ACE_MAIN (int argc, char *argv[])    /* user's entry point, e.g., main */ \
00146 { \
00147   return ace_os_main_i (argc, argv); /* what the user calls "main" */ \
00148 } \
00149 int \
00150 ace_main_i
00151 
00152 #   elif !defined (ACE_HAS_WINCE)
00153 
00154 #     if defined (ACE_WIN32) && defined (ACE_USES_WCHAR)
00155 
00156 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00157 
00158 class ACE_Export ACE_Main_Base
00159 {
00160 public:
00161   int run (int, ACE_TCHAR *[]);
00162   virtual int run_i (int, ACE_TCHAR *[]) = 0;
00163 };
00164 
00165 ACE_END_VERSIONED_NAMESPACE_DECL
00166 
00167 #       define wmain \
00168 ace_wmain_i (int, ACE_TCHAR *[]); \
00169 ACE_Export int ace_os_wmain_i (ACE_Main_Base&, int, ACE_TCHAR *[]); \
00170 class ACE_Main : public ACE_Main_Base {int run_i (int, ACE_TCHAR *[]);}; \
00171 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00172 { \
00173   return ace_wmain_i (argc, argv); \
00174 } \
00175 int \
00176 ACE_WMAIN (int argc, ACE_TCHAR *argv[]) /* user's entry point, e.g., wmain */ \
00177 { \
00178   ACE_Main m; \
00179   return ace_os_wmain_i (m, argc, argv);   /* what the user calls "main" */ \
00180 } \
00181 int \
00182 ace_wmain_i
00183 
00184 #     else /* ! (ACE_WIN32 && ACE_USES_WCHAR) */
00185 
00186 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00187 
00188 class ACE_Export ACE_Main_Base
00189 {
00190 public:
00191   ACE_Main_Base ();
00192   virtual ~ACE_Main_Base ();
00193   int run (int, char *[]);
00194   virtual int run_i (int, char *[]) = 0;
00195 };
00196 
00197 ACE_END_VERSIONED_NAMESPACE_DECL
00198 
00199 /*
00200 ** LabVIEW RT cannot directly use an executable. Need to build the program
00201 ** as a DLL and call it from something else. The ACE test framework knows this
00202 ** trick and uses a LabVIEW RT target-resident control program to load a
00203 ** DLL, look up it's main() entrypoint, and call it.
00204 */
00205 #       if defined (ACE_BUILD_LABVIEW_EXE_AS_DLL)
00206 extern "C" __declspec (dllexport) int main (int, char *[]);
00207 #       endif /* ACE_BUILD_LABVIEW_EXE_AS_DLL) */
00208 
00209 #       define main \
00210 ace_main_i (int, char *[]); \
00211 ACE_BEGIN_VERSIONED_NAMESPACE_DECL \
00212 ACE_Export int ace_os_main_i (ACE_Main_Base&, int, char *[]); \
00213 class ACE_Main : public ACE_Main_Base {int run_i (int, char *[]);}; \
00214 inline int ACE_Main::run_i (int argc, char *argv[])  \
00215 { \
00216   return ace_main_i (argc, argv); \
00217 } \
00218 ACE_END_VERSIONED_NAMESPACE_DECL \
00219 int \
00220 ACE_MAIN (int argc, char *argv[]) /* user's entry point, e.g., wmain */ \
00221 { \
00222   ACE_Main m; \
00223   return m.run (argc, argv); /*ace_os_main_i (m, argc, argv);   what the user calls "main" */ \
00224 } \
00225 int \
00226 ace_main_i
00227 
00228 #     endif /* ACE_WIN32 && ACE_USES_WCHAR */
00229 
00230 #   else /* ACE_HAS_WINCE */
00231 
00232 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
00233 
00234 class ACE_Export ACE_Main_Base
00235 {
00236 public:
00237   int run (HINSTANCE, HINSTANCE, LPWSTR, int);
00238   virtual int run_i (int, ACE_TCHAR *[]) = 0;
00239 };
00240 
00241 ACE_END_VERSIONED_NAMESPACE_DECL
00242 
00243 #     if defined (ACE_TMAIN)  // Use WinMain on CE; others give warning/error.
00244 #       undef ACE_TMAIN
00245 #     endif  // ACE_TMAIN
00246 
00247 // Support for ACE_TMAIN, which is a recommended way. It would be nice if
00248 // CE had CommandLineToArgvW()... but it's only on NT3.5 and up.
00249 
00250 #     define ACE_TMAIN \
00251 ace_tmain_i (int, ACE_TCHAR *[]); \
00252 class ACE_Main : public ACE_Main_Base {int run_i (int argc, ACE_TCHAR *argv[]);}; \
00253 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00254 { \
00255   return ace_tmain_i (argc, argv); \
00256 } \
00257 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) \
00258 { \
00259   ACE_Main m; \
00260   return m.run (hInstance, hPrevInstance, lpCmdLine, nCmdShow); \
00261 } \
00262 int ace_tmain_i
00263 
00264 // Support for wchar_t but still can't fit to CE because of the command
00265 // line parameters.
00266 #     define wmain \
00267 ace_wmain_i (int, ACE_TCHAR *[]); \
00268 ACE_Export int ace_os_winwmain_i (ACE_Main_Base&, hInstance, hPrevInstance, lpCmdLine, nCmdShow);  /* forward declaration */ \
00269 class ACE_Main : public ACE_Main_Base {int run_i (int argc, ACE_TCHAR *argv[]);}; \
00270 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00271 { \
00272   return ace_wmain_i (argc, argv); \
00273 } \
00274 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) \
00275 { \
00276   return ace_os_winwmain_i (hInstance, hPrevInstance, lpCmdLine, nCmdShow); \
00277 } \
00278 int ace_wmain_i
00279 
00280 // Supporting legacy 'main' is A LOT easier for users than changing existing
00281 // code on WinCE. Unfortunately, evc 3 can't grok a #include within the macro
00282 // expansion, so it needs to go out here.
00283 #     include "ace/Argv_Type_Converter.h"
00284 #     define main \
00285 ace_main_i (int, ACE_TCHAR *[]); \
00286 ACE_Export int ace_os_winmain_i (ACE_Main_Base&, hInstance, hPrevInstance, lpCmdLine, nCmdShow);  /* forward declaration */ \
00287 class ACE_Main : public ACE_Main_Base {int run_i (int argc, ACE_TCHAR *argv[]);}; \
00288 inline int ACE_Main::run_i (int argc, ACE_TCHAR *argv[])  \
00289 { \
00290   return ace_main_i (argc, argv); \
00291 } \
00292 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) \
00293 { \
00294   return ace_os_winmain_i (hInstance, hPrevInstance, lpCmdLine, nCmdShow); \
00295 } \
00296 int ace_main_i
00297 
00298 #   endif   /* ACE_PSOSIM */
00299 # endif /* ACE_HAS_NONSTATIC_OBJECT_MANAGER && !ACE_HAS_WINCE && !ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER */
00300 
00301 # include /**/ "ace/post.h"
00302 
00303 #endif /* ACE_OS_MAIN_H */

Generated on Tue Feb 2 17:18:41 2010 for ACE by  doxygen 1.4.7