Python 2.7 从windows路径而不是清单加载了不正确的DLL

Python 2.7 从windows路径而不是清单加载了不正确的DLL,python-2.7,py2exe,dllregistration,comtypes,Python 2.7,Py2exe,Dllregistration,Comtypes,我在注册用Python编写的COM服务器时遇到了一个问题,该服务器似乎与标准uuid Python模块相关 我在64位Windows7 Professional上运行32位Python 2.7.9 当我在服务器中包含uuid模块时,在注册或注销过程中(使用regsvr32)出现故障。如果我从我的项目中删除uuid,一切看起来都正常 我用依赖步行器进行了调查。我对正在发生的事情没有详细的了解,但很明显,进程在Windows路径中找到了MSVCR90.DLL的副本,而该副本恰好是DLL的错误版本,因

我在注册用Python编写的COM服务器时遇到了一个问题,该服务器似乎与标准uuid Python模块相关

我在64位Windows7 Professional上运行32位Python 2.7.9

当我在服务器中包含uuid模块时,在注册或注销过程中(使用regsvr32)出现故障。如果我从我的项目中删除uuid,一切看起来都正常

我用依赖步行器进行了调查。我对正在发生的事情没有详细的了解,但很明显,进程在Windows路径中找到了MSVCR90.DLL的副本,而该副本恰好是DLL的错误版本,因此出现了故障

现在我可以从路径中删除这个特定的MSVCR90.DLL文件,但它不属于我!它是由我们的It部门安装的一些英特尔软件的发行版!无论如何,我希望能够将我的服务器分发给其他用户,而不控制他们机器的配置

另一件需要注意的事情是,我在COM服务器DLL旁边的清单中提供了MSVCR90.DLL的正确版本(通常用于分发基于Python的DLL可执行文件)。因此,我希望Python uuid模块能够找到并使用该DLL

我完全卡住了。有人能提供解决方案吗

下面是依赖性步行者的一些摘录。我看到从Windows路径加载的DLL不正确

00:00:04.742: LoadLibraryA("msvcr90.dll") called from "c:\proj_py\gtxl\sxs\dist\_CTYPES.PYD" at address 0x1D1A9742.
00:00:04.773: Loaded "c:\program files (x86)\intel\icls client\MSVCR90.DLL" at address 0x59AE0000.  Successfully hooked module.
我看到下面几行(第一行和最后一行显示为红色)

这似乎是个错误

现在,在我看来,名为_CTYPES.PYD的Python DLL会导致加载不需要的DLL。我假设uuid模块正在调用Python ctypes模块,该模块以某种方式与_ctypes.pyd关联

这是否意味着Python2.7.9发行版中的_ctypes.pyd存在问题

也许还有最后一条线索。当我从路径中删除有问题的DLL时。注册过程无误。然而,在Dependency Walker中我看到了这一点

00:00:03.728: LoadLibraryA("msvcr90.dll") called from "c:\proj_py\gtxl\sxs\dist\_CTYPES.PYD" at address 0x1D1A9742.
00:00:03.759: LoadLibraryA("msvcr90.dll") returned NULL. Error: %1 is not a valid Win32 application (193).
第二行以红色突出显示。这一尝试似乎失败了,但注册仍在继续(我看不到对msvcr90.dll的任何其他引用)

下面是导致问题的一个简单示例的文件。我正在使用PythonComTypes包和py2exe来创建服务器

MIDL编译器必须遵守的IDL文件
test.IDL

import "oaidl.idl";
import "ocidl.idl";

[
        uuid(EAE82E0D-312C-4C23-99D8-8BA686D89B72),
        dual,
        oleautomation
]
interface IMSLTest : IDispatch {
        HRESULT TestMethod([in] INT a, [in] INT b, [out, retval] INT *presult);
}

[
      uuid(7587E538-7AFD-4663-A444-34F32997B0E9)
]
library MSLTestLib
{
        importlib("stdole2.tlb");

        [uuid(B7051914-24BC-4FBB-A447-F75A9FA8E295)]
              coclass MyObject {
              [default] interface IMSLTest;
        };
};
Python COM服务器的源文件,
server.py

import comtypes
import comtypes.server.inprocserver

import uuid

# # generate wrapper code for the type library, this needs
# # to be done only once (but also each time the IDL file changes)
# # !!! NB  It needs to be done before py2exe is run !!!
# from comtypes.client import GetModule
# GetModule("test.tlb")

# Something has been created here
from comtypes.gen.MSLTestLib import MyObject

class MyObjectImpl(MyObject):

    # registry entries
    _reg_threading_ = "Both"
    _reg_progid_ = "MSLTestLib.MyObject"
    _reg_desc_ = "A test COM server"
    _reg_clsctx_ = comtypes.CLSCTX_INPROC_SERVER

    def __init__(self):
        MyObject.__init__(self)
        l = uuid.uuid4().int

    def TestMethod(self,a,b):
        return a + b

if __name__ == "__main__":
    from comtypes.server.register import UseCommandLine
    UseCommandLine(MyObjectImpl)

    # # Does it work?
    # # Must register the server using the two lines above first, 
    # # then uncomment these and comment out those above.
    # from comtypes.client import CreateObject
    # x = CreateObject("MSLTestLib.MyObject")
    # print x.TestMethod(3,4)
以及py2exe的配置文件,
setup.py
(要放在清单中的文件全局特定于我的设置)

这是我的清单文件
Microsoft.VC90.CRT.manifest
,它与
msvcr90.dll
一起位于一个名为
Microsoft.VC90.CRT
的文件夹中,后者与我的COM服务器位于同一目录中

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) Microsoft Corporation.  All rights reserved. -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable/>
    <assemblyIdentity
        type="win32"
        name="Microsoft.VC90.CRT"
        version="9.0.21022.8"
        processorArchitecture="x86"
        publicKeyToken="1fc8b3b9a1e18e3b"
    >
    </assemblyIdentity>
    <file name="msvcr90.dll" /> 
</assembly>

DLL中还有一个嵌入式清单。这是py2exe自动生成的,没有我提供的任何内容。给你

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>


我也有同样的问题!你找到解决办法了吗?对不起,没有。我没有找到令人满意的解决办法。谢谢你的回复!我现在正在战斗。如果我能找到一个,我会发布一个决议。我已经找到了这方面的说明,看起来你做的每件事都完全正确,所以它令人困惑。。。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright (c) Microsoft Corporation.  All rights reserved. -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <noInheritable/>
    <assemblyIdentity
        type="win32"
        name="Microsoft.VC90.CRT"
        version="9.0.21022.8"
        processorArchitecture="x86"
        publicKeyToken="1fc8b3b9a1e18e3b"
    >
    </assemblyIdentity>
    <file name="msvcr90.dll" /> 
</assembly>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>