[Issue 1550] New: D DLLs close standard input/output streams when unloading
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Sun Oct 7 14:32:19 PDT 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1550
Summary: D DLLs close standard input/output streams when
unloading
Product: D
Version: 1.022
Platform: PC
OS/Version: Windows
Status: NEW
Severity: normal
Priority: P3
Component: DMD
AssignedTo: bugzilla at digitalmars.com
ReportedBy: thecybershadow at gmail.com
=== loader.d ===
import std.stdio;
import std.string;
import std.c.windows.windows;
void main()
{
writefln("Loading DLL...");
HANDLE h = LoadLibraryA("library.dll");
if(!h)
return writefln("Failed to load DLL.");
writefln("DLL loaded. Unloading...");
if(!FreeLibrary(h))
return writefln("Failed to unload DLL.");
writefln("DLL unloaded.");
}
=== library.d ===
(standard DLL template copied from the documentation)
import std.c.windows.windows;
HINSTANCE g_hInst;
extern (C)
{
void gc_init();
void gc_term();
void _minit();
void _moduleCtor();
void _moduleUnitTests();
}
extern (Windows)
BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
{
switch (ulReason)
{
case DLL_PROCESS_ATTACH:
gc_init(); // initialize GC
_minit(); // initialize module list
_moduleCtor(); // run module constructors
_moduleUnitTests(); // run module unit tests
break;
case DLL_PROCESS_DETACH:
gc_term(); // shut down GC
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
// Multiple threads not supported yet
return false;
}
g_hInst=hInstance;
return true;
}
=== output ===
Loading DLL...
DLL loaded. Unloading...
=== comments ===
D's runtime (DMC libc) closes the standard streams when the DLL is unloaded.
Call stack:
DllEntryPoint
__cexit
_exit
___fcloseall
_fclose
_close
Needless to say, that shouldn't happen with DLLs.
Workaround: import std.stdio and add
_fcloseallp = null;
somewhere in your DllMain.
--
More information about the Digitalmars-d-bugs
mailing list