Subject: RE: Can't Reference Stderr from a DLL
From: [email-masked] (John Cerney)

18 Mar 1997 19:15:58 -0800
Approved: [email-masked]
Distribution: cygnus
Message-ID: <[email-masked]>
Reply-To: John Cerney <[email-masked]>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7Bit
X-Mailer: BeyondMail for Windows/Professional 2.3
Original-To: "[email-masked]" <[email-masked]>,
        Sergey Okhapkin
	<[email-masked]>
X-BeyondMail-Priority: 1
Conversation-ID: <[email-masked]>
In-Reply-To: <[email-masked]>
X-Receipt-From-Agent: true
Original-Sender: [email-masked]

>
>  > main.c calls impure_setup() in the dll with main's impure_ptr as its 
>  argument
>  >        impure_setup() in init.cc takes the impure_ptr from main and 
>  copies the
>  >        value to its (the dll's) local copy of impure_ptr.
>  
>  It's not a suitable way for me :-( It requires explicit call to 
>  impure_setup() for _each_ project's dll! This will prevent easy porting (X 
>  stuff for example). If reent_data will be exported from within cygwin.dll, 
>  then it will be possible to write
> 

For my work of porting perl5.003_25 to cygwin32, this was not really a problem.
Perl uses dynamic libraries to load language extension modules. These modules
are built as DLLs and are loaded at run-time (for win32, using the
LoadLibraryEx and GetProcAddress calls) by one piece of code (dynaloader.c).
Dynaloader.c in perl is already different for each OS the language is ported
to, so it was not hard for me to add the call to impure_setup() in dynaloader.c
just after it loads the dll module.
 
>  #include <windows.h>
>  extern struct reent *_impure_ptr, *__imp_reent_data;
>  int WINAPI dll_main(HANDLE a, DWORD reason, void *q)
>  { switch (reason){
>     case DLL_PROCESS_ATTACH: break;
>     case DLL_PROCESS_DETACH: break;
>     case DLL_THREAD_ATTACH:  break;
>     case DLL_THREAD_DETACH:  break;
>    }
>    _impure_ptr = __imp_reent_data;
>    return 1;
>  }
>  
>  and link this file to every DLL. Function dll_main (declared as entry point 
>  on ld's command line) will be called automatically after loading dll, and 
>  will set up dll's _impure_ptr right without explicit call to it! Number of 
>  dll's may vary - initialisation for each dll will be done automatically.
>  

This looks like a good, clean approach, hopefully cygnus will implement
something like this.

-
For help on using this list, send a message to
"[email-masked]" with one line of text: "help".