gpt4 book ai didi

Python COM 互操作 - 工厂模式

转载 作者:行者123 更新时间:2023-12-01 09:16:59 28 4
gpt4 key购买 nike

我有两个 python 类,它们都可以使用 COM 互操作机制独立于 VBA 编写脚本。但我希望一个能够以父子模式或工厂模式控制另一个的创建。

我已经尝试过,但无法开始工作,我已将其提炼为下面的 MCRE。我是 Python 新手。我想知道是否有某种方法可以继承 mixin,从而为类提供必要的 COM 互操作方法。

好的,我已经创建了一个 MCRE,这是 Python 代码,必须使用管理员权限从命令行运行至少一个才能完成 COM 注册(此后不需要管理员)。

import win32com.client


class MyParent(object):
_reg_clsid_ = "{C61A7C6E-B657-4D55-AD36-8850B2E501AC}"
_reg_progid_ = 'PythonInVBA.MyParent'
_public_methods_ = ['Greet', 'GetChild']

def __init__(self): # Rules of Com say paramerless constructors
self.child = MyChild()
self.child.SetName("foo")

def Greet(self):
return "Hello world"

def GetChild(self):
return self.child


class MyChild(object):
_reg_clsid_ = "{15DAAEE2-3A37-4DE1-9973-CCD011DF4888}"
_reg_progid_ = 'PythonInVBA.MyChild'
_public_methods_ = ['Initialize', 'GetName', 'SetName']

def __init__(self): # Rules of Com say paramerless constructors
pass

def GetName(self):
return self.name

def SetName(self, sName):
self.name = sName

if __name__ == '__main__':
print ("Registering COM servers...")
import win32com.server.register
win32com.server.register.UseCommandLine(MyParent)
win32com.server.register.UseCommandLine(MyChild)

这是 VBA 代码,前两个子过程有效,但第三个失败。

Option Explicit

Sub Test_MyParent_OnItsOwn()
On Error GoTo ErrHand:

Dim objMyParent As Object
Set objMyParent = VBA.CreateObject("PythonInVBA.MyParent")
Debug.Assert objMyParent.Greet = "Hello world"
Exit Sub
ErrHand:
Debug.Print Err.Description
End Sub

Sub Test_MyChild_OnItsOwn()
On Error GoTo ErrHand:

Dim objMyChild As Object
Set objMyChild = VBA.CreateObject("PythonInVBA.MyChild")

objMyChild.SetName "Kevin"
Debug.Assert objMyChild.GetName = "Kevin"
''' success MyChild is scriptable
Exit Sub
ErrHand:
Debug.Print Err.Description
End Sub


Sub Test_MyParent_Returning_MyChild()
On Error GoTo ErrHand:

Dim objMyParent As Object
Set objMyParent = VBA.CreateObject("PythonInVBA.MyParent")

Dim objMyChild As Object

'* errors with Unexpected Python Error: TypeError: Objects of type 'MyChild' can not be converted to a COM VARIANT (but obtaining the buffer() of this object could)
Set objMyChild = objMyParent.GetChild()

Exit Sub
ErrHand:
Debug.Print Err.Description
End Sub

最佳答案

我已将评论内容转换为答案。

这是因为 MyChild 不是作为 MyParent 中的 COM 对象生成的。
如果你按如下方式更改它就会起作用。

原文:

    def __init__(self):  # Rules of Com say paramerless constructors
self.child = MyChild()
self.child.SetName("foo")

修改:

    def __init__(self):  # Rules of Com say paramerless constructors
self.child = win32com.client.Dispatch("PythonInVBA.MyChild")
self.child.SetName("foo")

关于Python COM 互操作 - 工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51160152/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com