小编Swi*_*age的帖子

使用 pythoncom 在 Python 进程之间封送 COM 对象

我希望有人可以帮助我从 Python 对 Excel 进行编组的跨进程调用。

我有一个通过 Python 启动的 Excel 会话,我知道它会在需要从单独的 Python 进程访问时启动并运行。我使用编组CoMarshalInterfaceInStream()CoGetInterfaceAndReleaseStream()来自 pythoncom 模块的调用使一切正常工作,但我需要重复访问流(在我的情况下我只能设置一次),并且CoGetInterfaceAndReleaseStream()只允许一次访问接口。

我相信,我想实现是可以做到的是什么CreateStreamOnHGlobal()CoMarshalInterface()CoUnmarshalInterface()但我无法得到它的工作,几乎可以肯定,因为我不是在正确的参数传递。

我没有详细描述我的主要场景,而是设置了一个简单的示例程序,如下所示 - 显然这发生在同一过程中,但一次一个步骤!以下代码段工作正常:

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"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试以下操作时:

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)
Run Code Online (Sandbox Code Playgroud)

调用时出现此错误(我认为与第三个参数有关)pythoncom.CoMarshalInterface()

"ValueError: argument …
Run Code Online (Sandbox Code Playgroud)

python com excel marshalling pythoncom

4
推荐指数
1
解决办法
1811
查看次数

标签 统计

com ×1

excel ×1

marshalling ×1

python ×1

pythoncom ×1