ctypes - unloading implicitly loaded dlls

Scott Pigman scott.pigman at gmail.com
Sun Jul 27 07:47:33 EDT 2008


Here's what I'm struggling with (as best as I can understand it):

I'm writing a program that uses functionality from two different sets of
cdlls which reside in two different directories, call them 'libA.dll' and
'libB.dll'.  Although I don't directly use it, both directories contain a
dll with the same name, although they aren't in fact identical.  Call them,
"libC.dll".  However, the c-functions I call from the clls I do use seem to
implicitly use "libC.dll".  The problem that occurs is that after I load one
dll and call functions in it, when I try to load the second dll I get
windows errors because the second dll tries to call a function in its
version of libC.dll, but it finds the version meant for libB.dll, which
doesn't contain that function.

Oy, I hope some sample code makes it clearer:


def demo():

     A = ctypes.cdll.LoadLibrary('/path1/libA.dll')
     A.foo() # implicitly uses '/path1/libC.dll'

     _ctypes.FreeLibrary(A._handle)

     # CRASH! "The procedure entry point some_func could not be located
     # in the dynamic link library libC.dll.":
     B = ctypes.cdll.LoadLibrary('/path2/libB.dll')

     # libB.dll wants to use code from '/path2/libC.dll', but
     # instead it finds '/path1/libC.dll' already loaded
     # in memory, which doesn't
     # contain the function call it wants.

Assuming my understanding of things is correct, then I believe what I need
to do is to remove /path1/libC.dll from memory before I try loading
libB.dll, but I haven't found any way of doing that.  Can anyone offer my
some suggestions?


Notes:
* the two sets of dlls are supplied by a vendor for working with its COTS
packages; I don't have any control over the dll names used or the code
therein.
* If I leave out the call to A.foo(), then I don't crash, but if I leave out
the FreeLibrary call as well then I do crash.
* I've tried manipulating the PATH before loading the dlls, to no effect.
* I've tried del'ing A and running gc.collect() before loading B.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20080727/a91e7976/attachment.html>


More information about the Python-list mailing list