Artifact 9533046d0b42b4c67931a400fc7c32afa3bb068b
- File
src/dllmain.d
-
2015-05-05 06:49:05
- part of checkin
[9b639cf2d6]
on branch trunk
- Working version for update to 2.067.
The problem was __gshared. Replacing it with TLS fixed the issue. Remaining problem is that "hack.d"'s CloseHandle hack is not working anymore.
(user: kinaba) [annotate]
-
2015-05-05 06:49:05
- part of checkin
[9b639cf2d6]
on branch trunk
- Working version for update to 2.067.
import core.sys.windows.dll; import core.sys.windows.windows; //---------------------------------------------------------------- // おきまりのDLL初期化ルーチン //---------------------------------------------------------------- extern (Windows) BOOL DllMain( HINSTANCE inst, ULONG reason, void* reserved ) { switch( reason ) { case DLL_PROCESS_ATTACH: dll_process_attach( inst, true ); break; case DLL_PROCESS_DETACH: dll_process_detach( inst, true ); break; case DLL_THREAD_ATTACH: dll_thread_attach( true, true ); break; case DLL_THREAD_DETACH: dll_thread_detach( true, true ); break; default: } return true; } /* // Hack! // // _acrtused_dllが勝手に終了時に標準入出力ハンドルを // 閉じちゃって困るので、その辺りだけは閉じないような // CloseHandleを突っ込んで回避。 // // dmd v0.99 では動いていたのだけど最近のだとこれを入れると // 至る所でクラッシュするので考え直す必要がある。 // TODO: bug report. extern(Windows) { private alias BOOL function(HANDLE) ClHnT; private ClHnT Real_CloseHandle; private HANDLE stdin; private HANDLE stdout; private HANDLE stderr; BOOL CloseHandle( HANDLE h ) { if( h==stdin ) return TRUE; if( h==stdout ) return TRUE; if( h==stderr ) return TRUE; return Real_CloseHandle(h); } } static this() { Real_CloseHandle = cast(ClHnT) GetProcAddress( GetModuleHandleA("kernel32.dll"), "CloseHandle" ); stdin = GetStdHandle(STD_INPUT_HANDLE ); stdout = GetStdHandle(STD_OUTPUT_HANDLE); stderr = GetStdHandle(STD_ERROR_HANDLE ); } */