1

我正在尝试实现操作区域标识符以指定文件的下载位置——旧的新事物——Python 中的 MSDN 博客。

CoCreateInstance

pythoncom.CoCreateInstance(
        pywintypes.IID('{0968e258-16c7-4dba-aa86-462dd61e31a3}'),    #CLSID_PersistentZoneIdentifier
        None,pythoncom.CLSCTX_ALL,
        pywintypes.IID('{cd45f185-1b21-48e2-967b-ead743a8914e}'))    #IID_IZoneIdentifier

我收到一个错误:

TypeError: There is no interface object registered that supports this IID

(没有堆栈跟踪,因为这是一个扩展功能)

如果我用or替换IZoneIdentifierIID ,它可以工作,但是具有正确 IID 的 a 会失败并出现相同的错误。pythoncom.IID_IUnknownpythoncom.IID_IPersistFileQueryInterface

事实上,在 中HKCR\Interface,我什么都没有IZoneIdentifier看到,但确实看到了IPersistFile


disassembledurlmon.dll后,我看到它确实实现了接口,但没有在它的DllRegisterServer. 进一步搜索,我看到它IPersistFile正在被注册ole32.dll- 但不是IZoneIdentifier.

MSDN记录了这个接口从 IE6 开始可用。但它在 IE7 或 IE8 中都不存在。由于这是 XP(并且据称包含所有更新),因此我没有其他可尝试的方法。

同样,该接口存在于urlmon.hMSDN 文章中提到的文件中的 Windows SDK 7.0 中。

问题是:

  • 这个界面是否默默地放弃了,而没有 MSDN 反映这一点或其他什么?或者,这是一个已知问题吗?以后版本的 IE 可以用吗?
  • 哪些组件具有哪些功能ole32.dllurlmon.dll相关(因此我可以尝试(卸载)为它们安装更新)?
4

1 回答 1

2

没什么不好的IZoneIdentifier。原始的 C++ 程序运行良好。正如@IgorTandetnik 指出的那样,并非对象实现的每个接口都会在注册表中注册,只有那些支持编组的接口。

错误来自pythoncom自身(提示它是 a TypeError, not pythoncom.com_error,并且错误消息始终是英文而不是系统的 UI 语言)。

原因是pythoncom确实需要IDispatch接口的支持——否则它无法推断出如何使用接口的函数和它们接受/返回的值。

唯一的例外是IUnknown编译了许多基于 - 的接口支持(IPersistFile其中之一;完整列表pythoncom.InterfaceNames显然在)。

IUnknown可以使用“pythoncom 扩展”模块添加对其他基于接口的支持。关于它们的一些(非常稀缺的)文档可以pywin32Python 和 COM - 实施细节文章的文档中找到。

于 2016-11-08T23:52:09.983 回答