1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
// -*- C++ -*-
// $Id$
#include "ace/OS_main.h"
ACE_RCSID(ace, OS_main, "$Id$")
#if defined (ACE_HAS_NONSTATIC_OBJECT_MANAGER) && !defined (ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER)
# if !defined (ACE_HAS_MINIMAL_ACE_OS)
# include "ace/Object_Manager.h"
# endif /* ! ACE_HAS_MINIMAL_ACE_OS */
// Rename "main ()" on platforms that don't allow it to be called "main ()".
// Also, create ACE_Object_Manager static instance(s) in "main ()".
// ACE_MAIN_OBJECT_MANAGER defines the ACE_Object_Manager(s) that will
// be instantiated on the stack of main (). Note that it is only used
// when compiling main (): its value does not affect the contents of
// ace/OS.o.
# if !defined (ACE_MAIN_OBJECT_MANAGER)
# define ACE_MAIN_OBJECT_MANAGER \
ACE_OS_Object_Manager ace_os_object_manager; \
ACE_Object_Manager ace_object_manager;
# endif /* ! ACE_MAIN_OBJECT_MANAGER */
# if !defined (ACE_WINCE)
/* forward declaration */
int ace_main_i (int, char *[]);
# if defined (ACE_PSOSIM)
// PSOSIM root lacks the standard argc, argv command line parameters,
// create dummy argc and argv in the "real" main and pass to "user" main.
// NOTE: ACE_MAIN must be defined to give the return type as well as the
// name of the entry point.
ACE_MAIN () /* user's entry point, e.g., "main" w/out argc, argv */
{
int argc = 1; /* dummy arg count */
char *argv[] = {"psosim"}; /* dummy arg list */
ACE_MAIN_OBJECT_MANAGER
int ret_val = -1; /* assume the worst */
if (ACE_PSOS_Time_t::init_simulator_time ()) /* init simulator time */
{
ACE_ERROR((LM_ERROR, "init_simulator_time failed\n")); /* report */
}
else
{
ret_val = ace_main_i (argc, argv); /* call user main, save result */
}
ACE_OS::exit (ret_val); /* pass code to simulator exit */
}
# elif defined (ACE_PSOS) && defined (ACE_PSOS_LACKS_ARGC_ARGV)
// PSOS root lacks the standard argc, argv command line parameters,
// create dummy argc and argv in the "real" main and pass to "user" main.
// Ignore return value from user main as well. NOTE: ACE_MAIN must be
// defined to give the return type as well as the name of the entry point
ACE_MAIN () /* user's entry point, e.g., "main" w/out argc, argv */
{
int argc = 1; /* dummy arg count */
char *argv[] = {"root"}; /* dummy arg list */
ACE_MAIN_OBJECT_MANAGER
ace_main_i (argc, argv); /* call user main, ignore result */
}
# else /* ACE_PSOSIM */
int ace_os_main_i (int argc, char *argv[]) /* user's entry point, e.g., main */
{
ACE_MAIN_OBJECT_MANAGER
return ace_main_i (argc, argv); /* what the user calls "main" */
}
# if defined (ACE_WIN32)
int
ACE_WMAIN (int argc, ACE_TCHAR *argv[]) /* user's entry point, e.g., main */
{
ACE_MAIN_OBJECT_MANAGER
return ace_os_main_i (argc, argv); /* what the user calls "main" */
}
# endif /* ACE_WIN32 && UNICODE */
# endif /* ACE_PSOSIM */
# else /* ACE_WINCE */
# if defined (ACE_TMAIN) // Use WinMain on CE; others give warning/error.
# undef ACE_TMAIN
# endif // ACE_TMAIN
// CE only gets a command line string; no argv. So we need to convert it
// when the main entrypoint expects argc/argv. ACE_ARGV supports this.
# include "ace/ARGV.h"
// Support for ACE_TMAIN, which is a recommended way. It would be nice if
// CE had CommandLineToArgvW()... but it's only on NT3.5 and up.
int WINAPI ace_os_wintmain_i (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
ACE_TCHAR cmdline[1024];
ACE_OS::strcpy (cmdline, ACE_LIB_TEXT ("program "));
ACE_OS::strcat (cmdline, lpCmdLine);
ACE_ARGV ce_argv (cmdline);
ACE::init ();
ACE_MAIN_OBJECT_MANAGER
int i = ace_main_i (ce_argv.argc (), ce_argv.argv ());
ACE::fini ();
return i;
}
// Support for wchar_t but still can't fit to CE because of the command
// line parameters.
int WINAPI ace_os_winwmain_i (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
ACE_TCHAR cmdline[1024];
ACE_OS::strcpy (cmdline, ACE_LIB_TEXT ("program "));
ACE_OS::strcat (cmdline, lpCmdLine);
ACE_ARGV ce_argv (cmdline);
ACE::init ();
ACE_MAIN_OBJECT_MANAGER
int i = ace_main_i (ce_argv.argc (), ce_argv.argv ());
ACE::fini ();
return i;
}
// Supporting legacy 'main' is A LOT easier for users than changing existing
// code on WinCE. Unfortunately, evc 3 can't grok a #include within the macro
// expansion, so it needs to go out here.
# include "ace/Argv_Type_Converter.h"
int WINAPI ace_os_winmain_i (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow)
{
ACE_TCHAR cmdline[1024];
ACE_OS::strcpy (cmdline, ACE_LIB_TEXT ("program "));
ACE_OS::strcat (cmdline, lpCmdLine);
ACE_ARGV ce_argv (cmdline);
ACE::init ();
ACE_MAIN_OBJECT_MANAGER
ACE_Argv_Type_Converter command_line (ce_argv.argc (), ce_argv.argv ());
int i = ace_main_i (command_line.get_argc(), command_line.get_ASCII_argv());
ACE::fini ();
return i;
}
int ace_main_i
# endif /* !ACE_WINCE */
# endif /* ACE_HAS_NONSTATIC_OBJECT_MANAGER && !ACE_HAS_WINCE && !ACE_DOESNT_INSTANTIATE_NONSTATIC_OBJECT_MANAGER */
|