rtoss - Blame information for rev 124

Subversion Repositories:
Rev:
Rev Author Line No. Line
89 roytam 1 #include "stdafx.h"
2 #include "app.h"
3 #include "log.h"
4 #include "memory.h"
5 #include "thread.h"
6 #include "window.h"
7 #include "string.h"
8 using namespace ki;
9  
10  
11  
12 //=========================================================================
13  
14 App* App::pUniqueInstance_;
15  
16 inline App::App()
17         : exitcode_    (-1)
18         , loadedModule_(0)
19         , hInst_       (::GetModuleHandle(NULL))
20 {
21         // 唯一のインスタンスは私です。
22         pUniqueInstance_ = this;
23 }
24  
25 #pragma warning( disable : 4722 ) // 警告:デストラクタに値が戻りません
26 App::~App()
27 {
28         // ロ[ド済みモジュ[ルがあれば閉じておく
124 roytam 29 #if !defined(TARGET_VER) || (defined(TARGET_VER) && TARGET_VER>310)
89 roytam 30         if( loadedModule_ & COM )
31                 ::CoUninitialize();
32         if( loadedModule_ & OLE )
33                 ::OleUninitialize();
124 roytam 34 #endif
89 roytam 35  
36         // 終〜了〜
37         ::ExitProcess( exitcode_ );
38 }
39  
40 inline void App::SetExitCode( int code )
41 {
42         // 終了コ[ドを設定
43         exitcode_ = code;
44 }
45  
46 void App::InitModule( imflag what )
47 {
48         // 初期化済みでなければ初期化する
49         if( !(loadedModule_ & what) )
50                 switch( what )
51                 {
52                 case CTL: ::InitCommonControls(); break;
124 roytam 53 #if !defined(TARGET_VER) || (defined(TARGET_VER) && TARGET_VER>310)
89 roytam 54                 case COM: ::CoInitialize( NULL ); break;
55                 case OLE: ::OleInitialize( NULL );break;
124 roytam 56 #endif
89 roytam 57                 }
58  
59         // 今回初期化したモノを記憶
60         loadedModule_ |= what;
61 }
62  
63 void App::Exit( int code )
64 {
65         // 終了コ[ドを設定して
66         SetExitCode( code );
67  
68         // 自殺
69         this->~App();
70 }
71  
72  
73  
74 //-------------------------------------------------------------------------
75  
76 const OSVERSIONINFO& App::osver()
77 {
78         static OSVERSIONINFO s_osVer;
79         if( s_osVer.dwOSVersionInfoSize == 0 )
80         {
81                 // 初回だけは情報取得
82                 s_osVer.dwOSVersionInfoSize = sizeof( s_osVer );
124 roytam 83 #if !defined(TARGET_VER) || (defined(TARGET_VER) && TARGET_VER>310)
89 roytam 84                 ::GetVersionEx( &s_osVer );
124 roytam 85 #else
86                 DWORD dwVersion = ::GetVersion();
87  
88                 s_osVer.dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
89                 s_osVer.dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
90                 if (dwVersion < 0x80000000)              
91                                 s_osVer.dwBuildNumber = (DWORD)(HIWORD(dwVersion));
92  
93                 if(s_osVer.dwMajorVersion == 3) s_osVer.dwPlatformId=VER_PLATFORM_WIN32_NT;
94                 else if(s_osVer.dwMajorVersion == 4)
95                 {
96                         if(s_osVer.dwMinorVersion == 0)
97                         {
98                                 if(s_osVer.dwBuildNumber <= 950 || s_osVer.dwBuildNumber == 1111 || s_osVer.dwBuildNumber == 1214)
99                                         s_osVer.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS;
100                                 else s_osVer.dwPlatformId=VER_PLATFORM_WIN32_NT;
101                         }
102                         else
103                         {
104                                 s_osVer.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS;
105                         }
106                 }
107                 else s_osVer.dwPlatformId=VER_PLATFORM_WIN32_NT;
108 #endif
89 roytam 109         }
110         return s_osVer;
111 }
112  
113 bool App::isNewTypeWindows()
114 {
115         static const OSVERSIONINFO& v = osver();
116         return (
117                 ( v.dwPlatformId==VER_PLATFORM_WIN32_NT && v.dwMajorVersion>=5 )
118          || ( v.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS &&
119                   v.dwMajorVersion*100+v.dwMinorVersion>=410 )
120         );
121 }
122  
123 bool App::isWin95()
124 {
125         static const OSVERSIONINFO& v = osver();
126         return (
127                 v.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS &&
128                 v.dwMajorVersion==4 &&
129                 v.dwMinorVersion==0
130         );
131 }
132  
133 bool App::isNT()
134 {
135         static const OSVERSIONINFO& v = osver();
136         return v.dwPlatformId==VER_PLATFORM_WIN32_NT;
137 }
138  
103 roytam 139 bool App::isNewShell()
140 {
141         static const OSVERSIONINFO& v = osver();
142         return v.dwMajorVersion>3;
143 }
89 roytam 144  
145  
103 roytam 146  
89 roytam 147 //=========================================================================
148  
149 extern int kmain();
150  
151 namespace ki
152 {
153         void APIENTRY Startup()
154         {
155                 // Startup :
156                 // プログラム開始すると、真っ先にここに来ます。
157  
158                 // C++のロ[カルオブジェクトの破棄順序の仕様に
159                 // 自信がないので(^^;、スコ[プを利用して順番を強制
160                 // たぶん宣言の逆順だとは思うんだけど…
161  
162                 LOGGER( "StartUp" );
163                 App myApp;
164                 {
165                         LOGGER( "StartUp app ok" );
166                         ThreadManager myThr;
167                         {
168                                 LOGGER( "StartUp thr ok" );
169                                 MemoryManager myMem;
170                                 {
171                                         LOGGER( "StartUp mem ok" );
172                                         IMEManager myIME;
173                                         {
174                                                 LOGGER( "StartUp ime ok" );
175                                                 String::LibInit();
176                                                 {
177                                                         const int r = kmain();
178                                                         myApp.SetExitCode( r );
179                                                 }
180                                         }
181                                 }
182                         }
183                 }
184         }
185 }
186  
187 #ifdef SUPERTINY
188  
189         extern "C" int __cdecl _purecall(){return 0;}
190         #ifdef _DEBUG
191                 int main(){return 0;}
192         #endif
193         #pragma comment(linker, "/entry:\"Startup\"")
194  
195 #else
196  
197         // VS2005でビルドしてもWin95で動くようにするため
198         #if _MSC_VER >= 1400
199                 extern "C" BOOL WINAPI _imp__IsDebuggerPresent() { return FALSE; }
200         #endif
201  
202         int APIENTRY WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
203         {
204                 ki::Startup();
205                 return 0;
206         }
207  
208 #endif