dcdd144598 2011-02-23 kinaba: #include "stdafx.h" dcdd144598 2011-02-23 kinaba: #include "app.h" dcdd144598 2011-02-23 kinaba: #include "log.h" dcdd144598 2011-02-23 kinaba: #include "memory.h" dcdd144598 2011-02-23 kinaba: #include "thread.h" dcdd144598 2011-02-23 kinaba: #include "window.h" dcdd144598 2011-02-23 kinaba: #include "string.h" dcdd144598 2011-02-23 kinaba: using namespace ki; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: App* App::pUniqueInstance_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline App::App() dcdd144598 2011-02-23 kinaba: : exitcode_ (-1) dcdd144598 2011-02-23 kinaba: , loadedModule_(0) dcdd144598 2011-02-23 kinaba: , hInst_ (::GetModuleHandle(NULL)) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 唯一のインスタンスは私です。 dcdd144598 2011-02-23 kinaba: pUniqueInstance_ = this; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #pragma warning( disable : 4722 ) // 警告:デストラクタに値が戻りません dcdd144598 2011-02-23 kinaba: App::~App() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // ロード済みモジュールがあれば閉じておく dcdd144598 2011-02-23 kinaba: if( loadedModule_ & COM ) dcdd144598 2011-02-23 kinaba: ::CoUninitialize(); dcdd144598 2011-02-23 kinaba: if( loadedModule_ & OLE ) dcdd144598 2011-02-23 kinaba: ::OleUninitialize(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 終〜了〜 dcdd144598 2011-02-23 kinaba: ::ExitProcess( exitcode_ ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline void App::SetExitCode( int code ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 終了コードを設定 dcdd144598 2011-02-23 kinaba: exitcode_ = code; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void App::InitModule( imflag what ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 初期化済みでなければ初期化する dcdd144598 2011-02-23 kinaba: if( !(loadedModule_ & what) ) dcdd144598 2011-02-23 kinaba: switch( what ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: case CTL: ::InitCommonControls(); break; dcdd144598 2011-02-23 kinaba: case COM: ::CoInitialize( NULL ); break; dcdd144598 2011-02-23 kinaba: case OLE: ::OleInitialize( NULL );break; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 今回初期化したモノを記憶 dcdd144598 2011-02-23 kinaba: loadedModule_ |= what; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: void App::Exit( int code ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 終了コードを設定して dcdd144598 2011-02-23 kinaba: SetExitCode( code ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // 自殺 dcdd144598 2011-02-23 kinaba: this->~App(); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: const OSVERSIONINFO& App::osver() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: static OSVERSIONINFO s_osVer; dcdd144598 2011-02-23 kinaba: if( s_osVer.dwOSVersionInfoSize == 0 ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // 初回だけは情報取得 dcdd144598 2011-02-23 kinaba: s_osVer.dwOSVersionInfoSize = sizeof( s_osVer ); dcdd144598 2011-02-23 kinaba: ::GetVersionEx( &s_osVer ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: return s_osVer; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool App::isNewTypeWindows() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: static const OSVERSIONINFO& v = osver(); dcdd144598 2011-02-23 kinaba: return ( dcdd144598 2011-02-23 kinaba: ( v.dwPlatformId==VER_PLATFORM_WIN32_NT && v.dwMajorVersion>=5 ) dcdd144598 2011-02-23 kinaba: || ( v.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS && dcdd144598 2011-02-23 kinaba: v.dwMajorVersion*100+v.dwMinorVersion>=410 ) dcdd144598 2011-02-23 kinaba: ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool App::isWin95() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: static const OSVERSIONINFO& v = osver(); dcdd144598 2011-02-23 kinaba: return ( dcdd144598 2011-02-23 kinaba: v.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS && dcdd144598 2011-02-23 kinaba: v.dwMajorVersion==4 && dcdd144598 2011-02-23 kinaba: v.dwMinorVersion==0 dcdd144598 2011-02-23 kinaba: ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: bool App::isNT() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: static const OSVERSIONINFO& v = osver(); dcdd144598 2011-02-23 kinaba: return v.dwPlatformId==VER_PLATFORM_WIN32_NT; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: extern int kmain(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: namespace ki dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: void APIENTRY Startup() dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: // Startup : dcdd144598 2011-02-23 kinaba: // プログラム開始すると、真っ先にここに来ます。 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // C++のローカルオブジェクトの破棄順序の仕様に dcdd144598 2011-02-23 kinaba: // 自信がないので(^^;、スコープを利用して順番を強制 dcdd144598 2011-02-23 kinaba: // たぶん宣言の逆順だとは思うんだけど… dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: LOGGER( "StartUp" ); dcdd144598 2011-02-23 kinaba: App myApp; dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "StartUp app ok" ); dcdd144598 2011-02-23 kinaba: ThreadManager myThr; dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "StartUp thr ok" ); dcdd144598 2011-02-23 kinaba: MemoryManager myMem; dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "StartUp mem ok" ); dcdd144598 2011-02-23 kinaba: IMEManager myIME; dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: LOGGER( "StartUp ime ok" ); dcdd144598 2011-02-23 kinaba: String::LibInit(); dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: const int r = kmain(); dcdd144598 2011-02-23 kinaba: myApp.SetExitCode( r ); dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #ifdef SUPERTINY dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: extern "C" int __cdecl _purecall(){return 0;} dcdd144598 2011-02-23 kinaba: #ifdef _DEBUG dcdd144598 2011-02-23 kinaba: int main(){return 0;} dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: #pragma comment(linker, "/entry:\"Startup\"") dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #else dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: // VS2005でビルドしてもWin95で動くようにするため dcdd144598 2011-02-23 kinaba: #if _MSC_VER >= 1400 dcdd144598 2011-02-23 kinaba: extern "C" BOOL WINAPI _imp__IsDebuggerPresent() { return FALSE; } dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int APIENTRY WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: ki::Startup(); dcdd144598 2011-02-23 kinaba: return 0; dcdd144598 2011-02-23 kinaba: } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: #endif