Python から Excel へのマーシャリングされたクロスプロセス呼び出しを行うことができるように、誰かが私を助けてくれることを願っています。
別の Python プロセスからアクセスする必要があるときに、Python を介して開始された Excel セッションが起動して実行されることがわかっています。マーシャリングとpythoncomモジュールからの呼び出しを使用して、すべてがCoMarshalInterfaceInStream()
必要CoGetInterfaceAndReleaseStream()
に応じて機能していますが、ストリームへの繰り返しアクセスが必要であり(私の場合は1回しか設定できません)、CoGetInterfaceAndReleaseStream()
インターフェースへの1回だけのアクセスを許可します。
私が達成したいことは で実行できると信じていますがCreateStreamOnHGlobal()
、正しいパラメーターを渡していないため、ほぼ確実に機能させることができません。CoMarshalInterface()
CoUnmarshalInterface()
私の主なシナリオを詳細に説明するのではなく、簡単なサンプル プログラムを次のように設定しました。明らかに、これは同じプロセスで行われますが、一度に 1 ステップずつ行われます。次のスニペットは正常に機能します。
import win32com.client
import pythoncom
excelApp = win32com.client.DispatchEx("Excel.Application")
marshalledExcelApp = pythoncom.CoMarshalInterThreadInterfaceInStream(pythoncom.IID_IDispatch, excelApp)
xlApp = win32com.client.Dispatch(
pythoncom.CoGetInterfaceAndReleaseStream(marshalledExcelApp, pythoncom.IID_IDispatch))
xlWb = xlApp.Workbooks.Add()
xlWs = xlWb.Worksheets.Add()
xlWs.Range("A1").Value = "AAA"
ただし、次のことを試すと:
import win32com.client
import pythoncom
excelApp = win32com.client.DispatchEx("Excel.Application")
myStream = pythoncom.CreateStreamOnHGlobal()
pythoncom.CoMarshalInterface(myStream,
pythoncom.IID_IDispatch,
excelApp,
pythoncom.MSHCTX_LOCAL,
pythoncom.MSHLFLAGS_TABLESTRONG)
myUnmarshaledInterface = pythoncom.CoUnmarshalInterface(myStream, pythoncom.IID_IDispatch)
への呼び出しを行うときに、このエラーが発生します(これは3番目のパラメーターに関連していると思います)pythoncom.CoMarshalInterface()
:
"ValueError: argument is not a COM object (got type=instance)"
この簡単な例を機能させる方法を知っている人はいますか?
前もって感謝します