Я пытаюсь реализовать Manipulating the zone identifier to specify where a file was download from – The Old New Thing - MSDN blogs в Python.pythoncom.CoCreateInstance не может создать IZoneIdentifier; интерфейс отсутствует в реестре, несмотря на то, что он документирован в 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
(Нет StackTrace, так как это не является функцией расширения)
Если я заменю IZoneIdentifier
IID с pythoncom.IID_IUnknown
или pythoncom.IID_IPersistFile
, он работает, но QueryInterface
с правильной ошибкой IID с той же ошибкой.
Действительно, в HKCR\Interface
, я не вижу ничего подобного IZoneIdentifier
, но вижу IPersistFile
.
Разобрав urlmon.dll
, я вижу, что он действительно реализует интерфейс, но не регистрирует его в DllRegisterServer
. В дальнейшем, я вижу, что IPersistFile
регистрируется ole32.dll
- но не IZoneIdentifier
.
MSDN этот интерфейс будет доступен с IE6. Но его нет ни в IE7, ни в IE8. Поскольку это XP (и со всеми обновлениями якобы), мне больше нечего попробовать.
Аналогично, интерфейс присутствует в Windows SDK 7.0 в файле urlmon.h
, упомянутом в статье MSDN.
Вопросов:
- Был ли этот интерфейс молча упал в пользу чего-то еще без MSDN отражающем, что или что-то? Или это известная проблема? Доступна ли она в более поздних версиях IE?
- Какие компоненты имеют
ole32.dll
иurlmon.dll
относятся к (поэтому я могу попробовать (un) устанавливать обновления для них)?
Не каждый интерфейс упоминается в реестре - только те, у которых есть поддержка маршалинга (вся точка регистрации интерфейса - сообщить системе, как она маршализована). По-видимому, 'IZoneIdentifier' не разрешает маршалинг. –
Я бы предположил, что Python нуждается в библиотеке типов, описывающей интерфейс, чтобы узнать, какие методы он предоставляет. Набор интерфейсов, описанных в библиотеке типов, по-прежнему меньше, чем набор интерфейсов, зарегистрированных для маршалинга. –
@IgorTandetnik Работает оригинальная программа на C++. Таким образом, это действительно что-то не так с требованиями Python. Осталось только выяснить, что именно. Это определенно не TypeLib, потому что 'pythoncom' может работать с последним связыванием просто отлично. Это довольно отпадает, поскольку функции 'pywin32' обычно стремятся быть просто питоническими оболочками над базовым API, с минимальным необходимым количеством дополнительной логики. –