digitalmars.D.bugs - [Issue 1550] New: D DLLs close standard input/output streams when unloading
- d-bugmail puremagic.com (79/79) Oct 07 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1550
- d-bugmail puremagic.com (8/8) Oct 07 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1550
- d-bugmail puremagic.com (14/14) Apr 07 2010 http://d.puremagic.com/issues/show_bug.cgi?id=1550
- d-bugmail puremagic.com (10/10) Oct 06 2010 http://d.puremagic.com/issues/show_bug.cgi?id=1550
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 digitalmars.com
ReportedBy: thecybershadow 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.
--
Oct 07 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1550 I just noticed that this is somewhat documented at http://digitalmars.com/d/dll.html#Dcode . However, this applies not only when a program in D is the one loading the DLL. Thus, it should be moved outside the "D code calling D code in DLLs" section, and also into the "DLLs with a C Interface" source code template. --
Oct 07 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1550
Rainer Schuetze <r.sagitario gmx.de> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |r.sagitario gmx.de
PDT ---
The workaround (setting _fcloseallp = null) also prevents any other open file
from being closed.
I think it should be fixed in the C-runtime library, where the handle for
stdin/out/err is taken from a call to GetStdHandle(), and probably should not
be closed when terminating.
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Apr 07 2010
http://d.puremagic.com/issues/show_bug.cgi?id=1550
SHOO <zan77137 nifty.com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |zan77137 nifty.com
*** Issue 4996 has been marked as a duplicate of this issue. ***
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Oct 06 2010









d-bugmail puremagic.com 