【发布时间】:2014-09-29 02:13:20
【问题描述】:
我有一个第三方封闭源代码库,它是使用 Visual Studio 2010 构建的 Windows DLL。 首先,我计划使用例如为该 dll 构建一个扩展模块。痛饮。 然而,它是用 VS 2010 构建的,而所有 python 2 发行版都是用 VS 2008 构建的,这一事实破坏了这一点。
现在看来 ctypes 没有这个限制。
我使用 VS 2010 构建了一个微不足道的 dll(dependency walker 显示 dll 链接到 msvcr100.dll),并带有一个函数:
int fnTestLib2(int a, int b)
{
return a+b;
}
在 ctypes 中加载它并
fcn = mydll.fnTestLib2
fcn.argtypes = [ctypes.c_int, ctypes.c_int]
fcn.restype = ctypes.c_int
print fcn(1,2)
正确打印3。
现在,我有些困惑:
这仅仅是因为我很幸运并且因为这个例子是微不足道的,还是ctypes 的底层技术和扩展模块有根本的区别?
如果是,那是什么? ;)
最后:为第三方 dll 实现 ctypes 包装库是否安全?
编辑 根据 Serge 的回答,我使用 distutils 结合 Windows SDK 编译了我的 swig 扩展。 所以,现在我有了我的扩展 bla.pyd,它似乎确实有效。 虽然我想知道这种对两个 c 运行时的依赖是否值得推荐。用dependency walker查看:
【问题讨论】:
-
您是否尝试过调用一些标准库函数,特别是那些属于 VS2010 运行时但尚未在 VS2008 中的函数?
-
据我所知,Windows DLL 可以正常工作:每个模块都有指向它需要的模块的指针,并且不同版本的 msvc dll 确实有不同的名称。所以我无法理解错误链接可能发生在哪里。即使是微软也可以做一些好事......过去的 DLL 地狱来自于一个事实,即一个 dll 的不同版本具有相同的名称,即使兼容性没有完全保证!