Program args fix for WinCE
[wxWidgets.git] / src / msw / main.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: msw/main.cpp
3 // Purpose: WinMain/DllMain
4 // Author: Julian Smart
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 // ============================================================================
13 // declarations
14 // ============================================================================
15
16 // ----------------------------------------------------------------------------
17 // headers
18 // ----------------------------------------------------------------------------
19
20 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
21 #pragma implementation
22 #endif
23
24 // For compilers that support precompilation, includes "wx.h".
25 #include "wx/wxprec.h"
26
27 #ifdef __BORLANDC__
28 #pragma hdrstop
29 #endif
30
31 #include "wx/event.h"
32 #include "wx/app.h"
33 #include "wx/cmdline.h"
34
35 #include "wx/msw/private.h"
36
37 #ifdef __BORLANDC__
38 // BC++ has to be special: its run-time expects the DLL entry point to be
39 // named DllEntryPoint instead of the (more) standard DllMain
40 #define DllMain DllEntryPoint
41 #endif
42
43 #if defined(__WXMICROWIN__)
44 #define HINSTANCE HANDLE
45 #endif
46
47 #if wxUSE_GUI
48
49 // ============================================================================
50 // implementation: various entry points
51 // ============================================================================
52
53 // ----------------------------------------------------------------------------
54 // Windows-specific wxEntry
55 // ----------------------------------------------------------------------------
56
57 WXDLLEXPORT int wxEntry(HINSTANCE hInstance,
58 HINSTANCE WXUNUSED(hPrevInstance),
59 wxCmdLineArgType WXUNUSED(pCmdLine),
60 int nCmdShow)
61 {
62 // remember the parameters Windows gave us
63 wxSetInstance(hInstance);
64 wxApp::m_nCmdShow = nCmdShow;
65
66 // parse the command line: we can't use pCmdLine in Unicode build so it is
67 // simpler to never use it at all (this also results in a more correct
68 // argv[0])
69
70 // break the command line in words
71 wxArrayString args;
72
73 const wxChar *cmdLine = ::GetCommandLine();
74 if ( cmdLine )
75 {
76 args = wxCmdLineParser::ConvertStringToArgs(cmdLine);
77 }
78
79 #ifdef __WXWINCE__
80 // WinCE doesn't insert the program itself, so let's
81 // do it here.
82 wxString programName;
83
84 if ( ::GetModuleFileName( (HMODULE) wxGetInstance(), wxStringBuffer(programName, MAX_PATH), MAX_PATH ) == 0)
85 {
86 wxLogLastError(_T("GetModuleFileName"));
87 }
88 args.Insert(programName, 0);
89 #endif
90
91 int argc = args.GetCount();
92
93 // +1 here for the terminating NULL
94 wxChar **argv = new wxChar *[argc + 1];
95 for ( int i = 0; i < argc; i++ )
96 {
97 argv[i] = wxStrdup(args[i]);
98 }
99
100 // argv[] must be NULL-terminated
101 argv[argc] = NULL;
102
103 return wxEntry(argc, argv);
104 }
105
106 // May wish not to have a DllMain or WinMain, e.g. if we're programming
107 // a Netscape plugin or if we're writing a console application
108 #if !defined(NOMAIN)
109
110 extern "C"
111 {
112
113 // ----------------------------------------------------------------------------
114 // WinMain
115 // ----------------------------------------------------------------------------
116
117 // Note that WinMain is also defined in dummy.obj, which is linked to
118 // an application that is using the DLL version of wxWidgets.
119
120 #if defined(_WINDLL)
121
122 // DLL entry point
123
124 BOOL WINAPI
125 DllMain(HANDLE hModule, DWORD fdwReason, LPVOID WXUNUSED(lpReserved))
126 {
127 // Only call wxEntry if the application itself is part of the DLL.
128 // If only the wxWidgets library is in the DLL, then the
129 // initialisation will be called when the application implicitly
130 // calls WinMain.
131 #ifndef WXMAKINGDLL
132 switch (fdwReason)
133 {
134 case DLL_PROCESS_ATTACH:
135 return wxEntry(hModule);
136
137 case DLL_PROCESS_DETACH:
138 wxEntryCleanup();
139 break;
140 }
141 #else
142 (void)hModule;
143 (void)fdwReason;
144 #endif // !WXMAKINGDLL
145
146 return TRUE;
147 }
148
149 #endif // _WINDLL
150
151 } // extern "C"
152
153 #endif // !NOMAIN
154
155 #endif // wxUSE_GUI
156
157 // ----------------------------------------------------------------------------
158 // global HINSTANCE
159 // ----------------------------------------------------------------------------
160
161 #if wxUSE_BASE
162
163 HINSTANCE wxhInstance = 0;
164
165 HINSTANCE wxGetInstance()
166 {
167 return wxhInstance;
168 }
169
170 void wxSetInstance(HINSTANCE hInst)
171 {
172 wxhInstance = hInst;
173 }
174
175 #endif // wxUSE_BASE
176