1

私はPythonでIDispatchインターフェイスのみを公開し、IDLファイルもタイプライブラリも持たないCOMサーバーを使用しようとしています。さまざまな方法とその使用方法に関するドキュメントがあります。

win32comパッケージを使用しようとすると失敗します。これは、タイプ情報が利用できない場合、属性アクセスがプロパティの取得または設定であり、メソッドの呼び出しではないと想定するためのwin32comフォールバックのように見えるためです。

つまり、私が次のことを行うとき:

  import win32com.client
  c = win32com.client.GetActiveObject(server_progid)
  c.someServerMethod(arg1, arg2)

win32comは、arg1、arg2を完全に無視して、サーバー上のsomeServerMethodプロパティを取得しようとします。コードを掘り下げると、Pythonがself .__getattr__を呼び出しているためと思われます。これにはarg1、arg2がありません。

私はこれを解決する方法を探しています:

  • 私が実際にメソッドを呼び出していることをwin32comに伝えるためのいくつかの構文;
  • この動作を実際に実装する他のPythonCOMクライアント。
  • 明らかな「ドキュメントを手動でタイプライブラリに変換する」以外のその他の提案。

ありがとう!

4

2 に答える 2

0

あなたは使用できるはずです

c._make_method_("someServerMethod")

プロパティではなくメソッドとして扱うようにwin32comに指示します。

于 2012-05-08T15:07:57.700 に答える
0

考えられる解決策 (現在実装中) は、いくつかのロジックを使用して、すべてのメソッド呼び出しに対して _make_method_ を呼び出すプロキシでwin32com.clientの使用をラップすることです。hereのコード レシピを使用して、get_ または set_ で始まらないすべてのプロパティをメソッドに変更しました (ほんの一例です。メソッドからプロパティを伝えることができるヒューリスティックなら何でも構いません)。

import new
from types import MethodType

class Proxy(object):

    def __init__(self, target):
        self._target = target

    def __getattr__(self, aname):
        target = self._target
        ### Beginning of special logic ###
        if aname[:4]!='set_' and aname[:4]!='get_':
        ### End of special logic ###
            # Rebind the method to the target.
            return new.instancemethod(f.im_func, self, target.__class__)
        else:
            return f
于 2012-05-09T11:44:05.363 に答える