Python 2.7 从windows路径而不是清单加载了不正确的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不正确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的错误版本,因
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>