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 );
}
*/