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