2016-11-06 6 views
0

Manipulating the zone identifier to specify where a file was download from – The Old New Thing - MSDN blogsをPythonで実装しようとしています。 CoCreateInstancepythoncom.CoCreateInstanceはIZoneIdentifierを作成できません。 MSDNで文書化されているにもかかわらず、インターフェイスもレジストリに存在しません

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

私はエラーを取得:私はIZoneIdentifier IIDを交換する場合

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

(このようませスタックトレースは、拡張機能ではありません)

pythoncom.IID_IUnknownまたはpythoncom.IID_IPersistFile 、それは動作しますが、右のIIDを持つQueryInterfaceが同じエラーで失敗します。

実際、HKCR\Interfaceでは、IZoneIdentifierのようなものは表示されませんが、IPersistFileが表示されます。 urlmon.dllを分解した


、私はそれが実際にインタフェースを実装していますが、そのDllRegisterServerに登録していないことがわかります。さらに検索すると、IPersistFileole32.dllで登録されていますが、IZoneIdentifierでは登録されていません。

MSDNこのインターフェイスは、IE6以降で使用できることを文書化しています。しかし、それはIE7かIE8のどちらにもありません。これはXPだからといって(すべての更新があると思われます)、私はもう何も試していません。

同様に、インターフェイスはWindows SDK 7.0のMSDNの資料に記載されているurlmon.hファイルに存在します。

質問は次のとおりです。

  • は、このインタフェースは黙っMSDNがそのか何かを反映せずに何か他の賛成で落としましたか?あるいは、これは既知の問題ですか? IEのそれ以降のバージョンで利用できますか?
  • ole32.dllurlmon.dllのコンポーネントは何ですか(更新プログラムをインストールしようとしていますか?)
+3

すべてのインターフェイスがレジストリに記載されているわけではありません。マーシャリングをサポートするインターフェイスのみがサポートされています(インターフェイスを登録するポイント全体が、マーシャリングの仕方をシステムに伝えることです)。どうやら、 'IZoneIdentifier'はマーシャリングを許可していません。 –

+0

私は、どのメソッドが提供されているかを知るために、Pythonがインターフェイスを記述するタイプライブラリを必要としていると思います。タイプライブラリに記述されているインターフェイスのセットは、マーシャリング用に登録されたインターフェイスのセットよりも小さくなります。 –

+0

@IgorTandetnik元のC++プログラムが動作します。だから、実際にはPythonの要件に間違っています。残されているのは、正確に何を見つけるかです。 'Pythoncom'は遅いバインディングでうまく動作するので、TypeLibは絶対にありません。 'pywin32'関数は一般に、必要最小限の追加ロジックだけで基本的なPythonラッパーになるように努力しているので、これはかなり不快です。 –

答えて

1

IZoneIdentifierで何も問題はありません。オリジナルのC++プログラムは正常に動作します。 @IgorTandetnik pointed outとして、オブジェクトが実装するすべてのインターフェイスがレジストリに登録されるわけではなく、マーシャリングをサポートするインターフェイスのみが登録されます。

エラーが(ヒントはそれがTypeError、ないpythoncom.com_errorだし、エラーメッセージが英語ではなく、システムのUI言語で常にあるということです)pythoncom自体から来ています。

原因は、pythoncomが実際にインターフェイスでIDispatchのサポートを必要としているか、またはインターフェイスの機能と受け入れ/返す値を操作する方法を推測できないということです。

唯一の例外はでコンパイルされた支持体(IPersistFileがそれらの一つであり、完全なリストは、明らかに、pythoncom.InterfaceNamesである)、IUnknownベースのインターフェイスの数です。

他のIUnknownのサポートは、「pythoncom extension」モジュールで追加できます。いくつか(非常に不足している)のドキュメントは、Python and COM - Implementation Detailsの記事のpywin32文書に記載されています。

関連する問題