On 19/12/2012 2:39 AM, Russell Warren wrote:
On Mon, Dec 17, 2012 at 10:25 PM, Mark Hammond
<mhamm...@skippinet.com.au <mailto:mhamm...@skippinet.com.au>> wrote:

    The VS2008 redistributables should probably be in the same directory
    (ie, msvc*90*.dll in system32) or else they might not be loaded.  If
    you use the "depends" tool from MS/sysinternals, you will see both
    Python itself and pythoncom depend on this.


I ran the depends tool [1] and sure enough, pythoncom27.dll has 3
missing dependencies: MSVCR90.DLL; IESHIMS.DLL; and WER.DLL

Screencap with additional errors here:
http://static.inky.ws/image/3530/Selection_249.png

Strangely, you can see in the screencap that MSVCR90.DLL is picked up
with no issues at all by python27.dll (version issues, maybe?!).
  Separate depends analysis of python27.dll does show the other 2 missing.

    Actually, assuming you are using a recent pywin32, pycomloader27.dll
    should also exist in that dir and should actually be used internally
    to load the COM object - this was done primarily as a work-around
    for exactly this problem.


Nope - no pycomloader27.dll.  Possibly this has not made it into the
latest ActiveState release?  I'll try a full install from pip.  The only
other python dll was pywintypes27.dll.

Maybe try a stand-alone pywin32 - as mentioned, pycomloader27.dll exists purely to work around this kind of problem.

    What matters is the complexity in how dependent DLLs are loaded - as
    the DLL COM object is loaded by some other app, the rules as applied
    to that app gets used for resolving DLL references.  The COM object
    as a .exe is its own app.


Thanks - I think I get it.  To paraphrase: You're saying that the
dependency issues still exist in the internals of the localserver.py
LocalServer32 implementation, but dependency loading is deferred and
there are no pre-checks.  ie: it may fall flat during runtime at some
point when a dependency is truly needed.  For the inproc version, the
windows internals that are loading the pythoncom27.dll are pre-loading
(or pre-checking) dependencies and crashing before it even gets started.
  Correct?

Sadly it is a little more complicated than that. Each .exe has its own "context" for resolving DLLs, and this context is inherited by other DLLs loaded in the process. The Python DLL (and the pycomloader DLL) jump through alot of hoops to arrange for their own context to be setup so we don't depend on the context of the loading .exe. When a inproc impl is used without pycomloader, the context of the embedding process is used (which is hard to predict). A localserver impl has its own context (as it is a .exe) so doesn't strike the same problem.

Indeed, pycomloader exists purely to jump through those context hoops - all it does is setup the context appropriately then call the pythoncom DLL (and those hoops can't be put into pythoncomxx.dll or things would go pear-shaped when that DLL is loaded by python itself).

Cheers,

Mark

Thanks very much for the tips.  I'll try and chase down these weird DLL
issues now.

Russ

[1] For anyone else landing here, 'depends' is available here (not
sysinternals): www.dependencywalker.com <http://www.dependencywalker.com/>


_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to