Differences From Artifact [9533046d0b42b4c6]:
- 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.
To Artifact [1df1b32171114527]:
- File
src/dllmain.d
- 2015-05-05 06:54:57 - part of checkin [57ea797fa4] on branch trunk - Correct fix for std file handle closing issue. (user: kinaba) [annotate]
1 1 import core.sys.windows.dll;
2 2 import core.sys.windows.windows;
3 +import std.stdio;
3 4
4 5 //----------------------------------------------------------------
5 6 // おきまりのDLL初期化ルーチン
6 7 //----------------------------------------------------------------
7 8
8 9 extern (Windows)
9 10 BOOL DllMain( HINSTANCE inst, ULONG reason, void* reserved )
................................................................................
11 12 switch( reason )
12 13 {
13 14 case DLL_PROCESS_ATTACH:
14 15 dll_process_attach( inst, true );
15 16 break;
16 17
17 18 case DLL_PROCESS_DETACH:
19 + _fcloseallp = null; // Do not close stdin/out/errs!!!
18 20 dll_process_detach( inst, true );
19 21 break;
20 22
21 23 case DLL_THREAD_ATTACH:
22 24 dll_thread_attach( true, true );
23 25 break;
24 26
................................................................................
26 28 dll_thread_detach( true, true );
27 29 break;
28 30
29 31 default:
30 32 }
31 33 return true;
32 34 }
33 -
34 -/*
35 -// Hack!
36 -//
37 -// _acrtused_dllが勝手に終了時に標準入出力ハンドルを
38 -// 閉じちゃって困るので、その辺りだけは閉じないような
39 -// CloseHandleを突っ込んで回避。
40 -//
41 -// dmd v0.99 では動いていたのだけど最近のだとこれを入れると
42 -// 至る所でクラッシュするので考え直す必要がある。
43 -// TODO: bug report.
44 -
45 -extern(Windows)
46 -{
47 - private alias BOOL function(HANDLE) ClHnT;
48 - private ClHnT Real_CloseHandle;
49 - private HANDLE stdin;
50 - private HANDLE stdout;
51 - private HANDLE stderr;
52 -
53 - BOOL CloseHandle( HANDLE h )
54 - {
55 - if( h==stdin ) return TRUE;
56 - if( h==stdout ) return TRUE;
57 - if( h==stderr ) return TRUE;
58 - return Real_CloseHandle(h);
59 - }
60 -}
61 -
62 -static this()
63 -{
64 - Real_CloseHandle = cast(ClHnT)
65 - GetProcAddress( GetModuleHandleA("kernel32.dll"), "CloseHandle" );
66 - stdin = GetStdHandle(STD_INPUT_HANDLE );
67 - stdout = GetStdHandle(STD_OUTPUT_HANDLE);
68 - stderr = GetStdHandle(STD_ERROR_HANDLE );
69 -}
70 -*/