Python win32com获取COM对象';类型名称或类别

Python win32com获取COM对象';类型名称或类别,python,com,pywin32,Python,Com,Pywin32,我目前正在尝试使用win32com在python中复制一些VBA代码。此特定代码使用TypeName,我已使用Excel制作了一个MWE(不是我正在使用的实际程序),如下所示: 将“工作表”打印为类型名的VBA脚本 公共子GetActiveSheet() MsgBox TypeName(ActiveSheet) 端接头 使用win32com.client.gencache.EnsureDispatch,似乎可以实现某些功能,例如: excel\u gc=win32com.client.genc

我目前正在尝试使用win32com在python中复制一些VBA代码。此特定代码使用
TypeName
,我已使用Excel制作了一个MWE(不是我正在使用的实际程序),如下所示:

将“工作表”打印为类型名的VBA脚本 公共子GetActiveSheet() MsgBox TypeName(ActiveSheet) 端接头 使用
win32com.client.gencache.EnsureDispatch
,似乎可以实现某些功能,例如:

excel\u gc=win32com.client.gencache.EnsureDispatch(“excel.Application”)
工作表\u gc=excel\u gc.ActiveSheet
#> 
类型(张)
#> 
不幸的是,我不得不在这个应用程序中使用
win32com.client.dynamic.Dispatch
,因为它似乎使用了一种通常返回“AnyObject”的工厂设计模式。当我使用dynamic.Dispatch时,我不再具有COMObject类型的信息:

excel=win32com.client.dynamic.Dispatch(“excel.Application”)
sheet=excel.ActiveSheet#
类型(张)
#> 

是否有人能够解释如何从
win32com.client.dynamic.Dispatch
中的
对象获取类型信息?谢谢

获得
类型的帮助有什么用?vba中是否有代码根据类型执行的操作?有一个switch语句根据工厂返回的对象更改行为。例如,
ShapeFactory()
可以返回
Square
Circle
,如果它是
Square
,那么我想要面积,如果它是
Circle
我想要周长。使用
win32com.client.gencache.EnsureDispatch
时,显示的类型将是
,而不是
,VB/VBA的TypeName的实际工作方式目前还没有文档记录。它混合了著名的VBA类型(如Integer或Boolean等)和“其他”类型的动态发现。动态发现基于IProvideClassInfo/IProvideClassInfo2接口(可能还有其他一些技巧)。这里有一个delphi示例:谢谢@SimonMourier,我将查看delphi代码,并尝试拼凑一个与python等效的代码。我会发布一个答案,如果我得到它的工作