NT DLL modules and C++

Gordon McMillan gmcm at hypernet.com
Thu Nov 4 19:41:05 EST 1999


Patrick J. Moran writes:

> I should clarify a bit.  I have an initFOO() call for my FOO
> module, and it gets called just fine.  I can manually call
> "placement new" constructors on the static data members of my
> classes to initialize them, but it's awkward and a hack.  It's
> also not a complete solution because there may be other static
> objects that belong to libraries whose implementation I'm not
> familiar with, e.g., iostreams.  There's got to be a better way.
> 
> My understanding is that there is an entry point,
> _DllMainCRTStartup, that the linker generates that calls the
> necessary C++ constructors, and then calls DllMain.  

It's a routine in the C runtime, not in your DLL.

> So, the good
> news is that I could call _DllMinCRTStartup and the appropriate
> construction code would be called, assuming I figure out the
> arguments required by _DllMainCRTStartup. 

I don't think you can call it.

> The bad news is that
> _DllMainCRTStartup calls DllMain, the entry point provided by the
> user (or the Python library, I presume).  

DllMain can be provided by the dll author. If he/she doesn't 
provide one, a dummy one will be created.

> DllMain in turn calls
> my initFOO (again, I presume) so I would be in an infinite loop. 
> Of course I could think of hacks to prevent the infinite looping.
>  Still, there's got to be a better way.

Nope. DllMain (the default one) does nothing. If you write one, 
it's generally to do things like set up TLS (which you probably 
_don't_ want to do with Python).
 
> The solution that I'm looking for is to get Python to call the
> constructor code when it does the dynamic linking.  I think this
> means calling _DllMainCRTStartup rather than DllMain.  I've tried
> looking through the doc in the PC directory, but it's still
> unclear to me.  That's what I was looking for help with.

It's not Python's responsibility, it's the runtime library.

I haven't tried it in a couple years, but I was never successful 
in getting static initializers to work with DLLs. In fact, I had a 
lot of problems with them in normal MSVC apps, so I got out 
of the habit of using them. I just "new" them on startup.

- Gordon




More information about the Python-list mailing list