www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 1550] New: D DLLs close standard input/output streams when unloading

reply d-bugmail puremagic.com writes:
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
next sibling parent d-bugmail puremagic.com writes:
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
prev sibling next sibling parent d-bugmail puremagic.com writes:
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
prev sibling parent d-bugmail puremagic.com writes:
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