Prev: recursive converting object to string which hasn't __str__ or/and__repr__
Next: Python - MySQL fetching values
From: Massi on 6 May 2010 04:22 Hi everyone, in my script I need to execute multiple separated loading of the same dll library, in order to handle the internal variables with different threads. Consider the followin piece of code: lib1 = cdll.LoadLibrary("MyLib.dll")) lib2 = cdll.LoadLibrary("MyLib.dll")) lib1.var1 = 0 lib2.var1 = 1 Now, if I print the value of lib1.var1 I get 1, that is lib1 and lib2 point to the same memory space. Is there a way to create "different instances" of the same library? Or, alternatively, does it exist any workaround to avoid lib1 and lib2 share the same memory space? Thanks in advance.
From: Dave Angel on 6 May 2010 05:21 Massi wrote: > Hi everyone, > > in my script I need to execute multiple separated loading of the same > dll library, in order to handle the internal variables with different > threads. > Consider the followin piece of code: > > lib1 = cdll.LoadLibrary("MyLib.dll")) > lib2 = cdll.LoadLibrary("MyLib.dll")) > > lib1.var1 = 0 > lib2.var1 = 1 > > Now, if I print the value of lib1.var1 I get 1, that is lib1 and lib2 > point to the same memory space. Is there a way to create "different > instances" of the same library? Or, alternatively, does it exist any > workaround to avoid lib1 and lib2 share the same memory space? > > Thanks in advance. > > Windows will not load the same DLL twice into the same process in two different places. When it detects that it's the same one, it simply returns the same handle as the earlier one, without any loading or initializing. With some DLL's, you might get away with copying it to a different filename, and then loading each as an independent item. But unless you wrote it yourself, or it has been documented for that behavior, you're taking a big risk. On the other hand, if the DLL was written with threading in mind, then it'll get notified for each new thread you create, and it can manage TLS (thread local storage) rather than using extern vars. I have no idea how to get at those from Python, however. DaveA
From: Stefan Schukat on 6 May 2010 05:56
Massi wrote: > > Hi everyone, > > > > in my script I need to execute multiple separated loading of the same > > dll library, in order to handle the internal variables with different > > threads. > > Consider the followin piece of code: > > > > lib1 = cdll.LoadLibrary("MyLib.dll")) > > lib2 = cdll.LoadLibrary("MyLib.dll")) > > > > lib1.var1 = 0 > > lib2.var1 = 1 > > > > Now, if I print the value of lib1.var1 I get 1, that is lib1 and lib2 > > point to the same memory space. Is there a way to create "different > > instances" of the same library? Or, alternatively, does it exist any > > workaround to avoid lib1 and lib2 share the same memory space? > > > > Thanks in advance. > > > > > Windows will not load the same DLL twice into the same process in two > different places. When it detects that it's the same one, it simply > returns the same handle as the earlier one, without any loading or > initializing. > > With some DLL's, you might get away with copying it to a different > filename, and then loading each as an independent item. But unless you > wrote it yourself, or it has been documented for that behavior, you're > taking a big risk. > > On the other hand, if the DLL was written with threading in mind, then > it'll get notified for each new thread you create, and it can manage TLS > (thread local storage) rather than using extern vars. I have no idea > how to get at those from Python, however. > > DaveA > > -- > http://mail.python.org/mailman/listinfo/python-list > The statement from Dave is as far true as the library is loaded without a path. Hence windows searches the system path and always finds the same file. If you load a DLL with an absolute path window will place the dll multiple times into the process. e.g. lib1 = cdll.LoadLibrary(r"c:\temp\MyLib.dll") lib2 = cdll.LoadLibrary(r"d:\temp\MyLib.dll") This has the same effect as renaming the library on the disk. Stefan |