9b639cf2d6 2015-05-05 kinaba: import core.sys.windows.dll; 9b639cf2d6 2015-05-05 kinaba: import core.sys.windows.windows; 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: //---------------------------------------------------------------- 9b639cf2d6 2015-05-05 kinaba: // おきまりのDLL初期化ルーチン 9b639cf2d6 2015-05-05 kinaba: //---------------------------------------------------------------- 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: extern (Windows) 9b639cf2d6 2015-05-05 kinaba: BOOL DllMain( HINSTANCE inst, ULONG reason, void* reserved ) 9b639cf2d6 2015-05-05 kinaba: { 9b639cf2d6 2015-05-05 kinaba: switch( reason ) 9b639cf2d6 2015-05-05 kinaba: { 9b639cf2d6 2015-05-05 kinaba: case DLL_PROCESS_ATTACH: 9b639cf2d6 2015-05-05 kinaba: dll_process_attach( inst, true ); 9b639cf2d6 2015-05-05 kinaba: break; 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: case DLL_PROCESS_DETACH: 9b639cf2d6 2015-05-05 kinaba: dll_process_detach( inst, true ); 9b639cf2d6 2015-05-05 kinaba: break; 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: case DLL_THREAD_ATTACH: 9b639cf2d6 2015-05-05 kinaba: dll_thread_attach( true, true ); 9b639cf2d6 2015-05-05 kinaba: break; 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: case DLL_THREAD_DETACH: 9b639cf2d6 2015-05-05 kinaba: dll_thread_detach( true, true ); 9b639cf2d6 2015-05-05 kinaba: break; 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: default: 9b639cf2d6 2015-05-05 kinaba: } 9b639cf2d6 2015-05-05 kinaba: return true; 9b639cf2d6 2015-05-05 kinaba: } 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: /* 9b639cf2d6 2015-05-05 kinaba: // Hack! 9b639cf2d6 2015-05-05 kinaba: // 9b639cf2d6 2015-05-05 kinaba: // _acrtused_dllが勝手に終了時に標準入出力ハンドルを 9b639cf2d6 2015-05-05 kinaba: // 閉じちゃって困るので、その辺りだけは閉じないような 9b639cf2d6 2015-05-05 kinaba: // CloseHandleを突っ込んで回避。 9b639cf2d6 2015-05-05 kinaba: // 9b639cf2d6 2015-05-05 kinaba: // dmd v0.99 では動いていたのだけど最近のだとこれを入れると 9b639cf2d6 2015-05-05 kinaba: // 至る所でクラッシュするので考え直す必要がある。 9b639cf2d6 2015-05-05 kinaba: // TODO: bug report. 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: extern(Windows) 9b639cf2d6 2015-05-05 kinaba: { 9b639cf2d6 2015-05-05 kinaba: private alias BOOL function(HANDLE) ClHnT; 9b639cf2d6 2015-05-05 kinaba: private ClHnT Real_CloseHandle; 9b639cf2d6 2015-05-05 kinaba: private HANDLE stdin; 9b639cf2d6 2015-05-05 kinaba: private HANDLE stdout; 9b639cf2d6 2015-05-05 kinaba: private HANDLE stderr; 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: BOOL CloseHandle( HANDLE h ) 9b639cf2d6 2015-05-05 kinaba: { 9b639cf2d6 2015-05-05 kinaba: if( h==stdin ) return TRUE; 9b639cf2d6 2015-05-05 kinaba: if( h==stdout ) return TRUE; 9b639cf2d6 2015-05-05 kinaba: if( h==stderr ) return TRUE; 9b639cf2d6 2015-05-05 kinaba: return Real_CloseHandle(h); 9b639cf2d6 2015-05-05 kinaba: } 9b639cf2d6 2015-05-05 kinaba: } 9b639cf2d6 2015-05-05 kinaba: 9b639cf2d6 2015-05-05 kinaba: static this() 9b639cf2d6 2015-05-05 kinaba: { 9b639cf2d6 2015-05-05 kinaba: Real_CloseHandle = cast(ClHnT) 9b639cf2d6 2015-05-05 kinaba: GetProcAddress( GetModuleHandleA("kernel32.dll"), "CloseHandle" ); 9b639cf2d6 2015-05-05 kinaba: stdin = GetStdHandle(STD_INPUT_HANDLE ); 9b639cf2d6 2015-05-05 kinaba: stdout = GetStdHandle(STD_OUTPUT_HANDLE); 9b639cf2d6 2015-05-05 kinaba: stderr = GetStdHandle(STD_ERROR_HANDLE ); 9b639cf2d6 2015-05-05 kinaba: } 9b639cf2d6 2015-05-05 kinaba: */