Index: src/dllmain.d ================================================================== --- src/dllmain.d +++ src/dllmain.d @@ -1,7 +1,8 @@ import core.sys.windows.dll; import core.sys.windows.windows; +import std.stdio; //---------------------------------------------------------------- // おきまりのDLL初期化ルーチン //---------------------------------------------------------------- @@ -13,10 +14,11 @@ case DLL_PROCESS_ATTACH: dll_process_attach( inst, true ); break; case DLL_PROCESS_DETACH: + _fcloseallp = null; // Do not close stdin/out/errs!!! dll_process_detach( inst, true ); break; case DLL_THREAD_ATTACH: dll_thread_attach( true, true ); @@ -28,43 +30,5 @@ 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 ); -} -*/ Index: src/testexe.d ================================================================== --- src/testexe.d +++ src/testexe.d @@ -5,17 +5,17 @@ alias extern(Windows) int function( HWND a, immutable char* b, char* c, DWORD d ) CmdFuncT; void main() { - HINSTANCE h = cast(HINSTANCE) Runtime.loadLibrary("QBga32.DLL"); for(;;) { write("> "); string s = readln(); if(s.length > 0) { + HINSTANCE h = cast(HINSTANCE) Runtime.loadLibrary("QBga32.DLL"); CmdFuncT Bga = cast(CmdFuncT)GetProcAddress(h, "Bga"); int r = Bga(NULL, s.toStringz(), null, 0); + Runtime.unloadLibrary(h); writeln("Return: ", r); } } - Runtime.unloadLibrary(h); }