2016-11-06 3 views
0

Я пытаюсь реализовать 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) устанавливать обновления для них)?
+3

Не каждый интерфейс упоминается в реестре - только те, у которых есть поддержка маршалинга (вся точка регистрации интерфейса - сообщить системе, как она маршализована). По-видимому, 'IZoneIdentifier' не разрешает маршалинг. –

+0

Я бы предположил, что Python нуждается в библиотеке типов, описывающей интерфейс, чтобы узнать, какие методы он предоставляет. Набор интерфейсов, описанных в библиотеке типов, по-прежнему меньше, чем набор интерфейсов, зарегистрированных для маршалинга. –

+0

@IgorTandetnik Работает оригинальная программа на C++. Таким образом, это действительно что-то не так с требованиями Python. Осталось только выяснить, что именно. Это определенно не TypeLib, потому что 'pythoncom' может работать с последним связыванием просто отлично. Это довольно отпадает, поскольку функции 'pywin32' обычно стремятся быть просто питоническими оболочками над базовым API, с минимальным необходимым количеством дополнительной логики. –

ответ

1

IZoneIdentifier ничего плохого. Исходная программа на C++ работает просто отлично. Как @IgorTandetnik pointed out, не каждый интерфейс, который реализует объект, будет зарегистрирован в реестре, только те, которые поддерживают сортировку.

ошибка происходит от самого pythoncom (намек на то, что это TypeError, не pythoncom.com_error, и сообщение об ошибке всегда на английском языке, а не язык пользовательского интерфейса системы).

Причина в том, что pythoncom действительно требует поддержки IDispatch интерфейса - или он не сможет определить, как работать с функциями и значениями интерфейса, которые они принимают/возвращают.

Единственным исключением является число IUnknown -На интерфейсов, поддержка которого составленным в (IPersistFile является одним из них, полный список находится в pythoncom.InterfaceNames, видимо).

Поддержка других интерфейсов IUnknown может быть добавлена ​​с помощью модуля расширения «pythoncom». Некоторую (очень скудную) документацию по ним можно найти в документах pywin32 в статье Python and COM - Implementation Details.

Смежные вопросы