关于COM的基本概念,可参考组件对象模型 COM 的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法。

1 使用 win32com

1.1 环境搭建

首先需要搭建Python的环境,需要安装win32com包,前往下载对应版本的安装包。

Note: 值得注意的是,若COM组件是32位的,则需要下载32位的Python和包,64位则下载64位对应包。

1.2 导出中间层py文件

在确保COM组件注册的情况下,需要使用win32com提供的工具makepy.py来生成一个Python的中间层。使用方法参考链接

主要步骤如下,

1. cd到makepy.py所在目录,一般为C:\Python3x\Lib\site-packages\win32com\client下;

2. 执行命令python makepy.py[ -o],其中括号内参数可以查看makepy.py文件内部说明;

3. 此时会弹出一个窗口,用于选择需要转换的控件;

com组件 vb和python python调用com组件_IDL

4. 选择完毕后会显示如下提示,找到提示目录下的py文件,可以打开查看;

com组件 vb和python python调用com组件_python_02

       5. py接口文件中会显示一些基本信息,以及内部的接口函数,

转换后的中间层文件完整代码如下,

com组件 vb和python python调用com组件_com组件 vb和python_03


1 # -*- coding: mbcs -*-
   2 # Created by makepy.py version 0.5.01
   3 # By python version 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)]
   4 # From type library ‘RuMasterLib.tlb‘
   5 # On Thu Oct 12 22:28:05 2017
   6 ‘RU Master 2.20 Type Library‘
   7 makepy_version = ‘0.5.01‘
   8 python_version = 0x30404f0
   9 
  10 import win32com.client.CLSIDToClass, pythoncom, pywintypes
  11 import win32com.client.util
  12 from pywintypes import IID
  13 from win32com.client import Dispatch
  14 
  15 # The following 3 lines may need tweaking for the particular server
  16 # Candidates are pythoncom.Missing, .Empty and .ArgNotFound
  17 defaultNamedOptArg=pythoncom.Empty
  18 defaultNamedNotOptArg=pythoncom.Empty
  19 defaultUnnamedArg=pythoncom.Empty
  20 
  21 CLSID = IID(‘{2C485B34-1437-4F59-8128-C387F8E8147B}‘)
  22 MajorVersion = 1
  23 MinorVersion = 0
  24 LibraryFlags = 8
  25 LCID = 0x0
  26 
  27 class constants:
  28     CH1_ASC                       =0          # from enum AscEcp
  29     CH1_ECP                       =1          # from enum AscEcp
  30     CH2_ASC                       =2          # from enum AscEcp
  31     CH2_ECP                       =3          # from enum AscEcp
  32     CH3_ASC                       =4          # from enum AscEcp
  33     CH3_ECP                       =5          # from enum AscEcp
  34     CH4_ASC                       =6          # from enum AscEcp
  35     CH4_ECP                       =7          # from enum AscEcp
  36     AUX_BR_1152                   =2          # from enum AuxBitR
  37     AUX_BR_384                    =1          # from enum AuxBitR
  38     AUX_BR_96                     =0          # from enum AuxBitR
  39     AUX_SOURCE_EXT_CONN           =0          # from enum AuxSource
  40     AUX_SOURCE_USB                =1          # from enum AuxSource
  41     EVENT_1                       =1          # from enum BBclkEvent
  42     EVENT_2                       =2          # from enum BBclkEvent
  43     EVENT_3                       =3          # from enum BBclkEvent
  44     EVENT_4                       =4          # from enum BBclkEvent
  45     NO_EVENT                      =0          # from enum BBclkEvent
  46     DISABLED                      =0          # from enum BfnControl
  47     FIRST_EVENT                   =1          # from enum BfnControl
  48     EVENT1                        =0          # from enum BfnEvent
  49     EVENT2                        =1          # from enum BfnEvent
  50     EVENT3                        =2          # from enum BfnEvent
  51     EVENT4                        =3          # from enum BfnEvent
  52     EXCEPTIONAL                   =1          # from enum BfnMode
  53     normal                        =0          # from enum BfnMode
  54     DISABLE                       =0          # from enum BfnUpdate
  55     EVERY_EV                      =2          # from enum BfnUpdate
  56     FIRST_EV                      =1          # from enum BfnUpdate
  57     IMMEDIATELY                   =3          # from enum BfnUpdate
  58     CdmaSource                    =4          # from enum CarrierSourceType
  59     GsmSource                     =1          # from enum CarrierSourceType
  60     LteSource                     =3          # from enum CarrierSourceType
  61     StaticSource                  =0          # from enum CarrierSourceType
  62     WcdmaSource                   =2          # from enum CarrierSourceType
  63     DCM_CLK                       =0          # from enum ClkSrc
  64     LTU_CLK                       =1          # from enum ClkSrc
  65     RET0                          =4          # from enum Com0ComPort
  66     TPF0                          =0          # from enum Com0ComPort
  67     TPF1                          =1          # from enum Com0ComPort
  68     TPF2                          =2          # from enum Com0ComPort
  69     TPF3                          =3          # from enum Com0ComPort
  70     CPC_FSM_DISABLE               =2          # from enum CpcFsmLoopMode
  71     CPC_FSM_START_OVER            =0          # from enum CpcFsmLoopMode
  72     CPC_FSM_STAY_IN_LAST          =1          # from enum CpcFsmLoopMode
  73     CNF_CASC_CW                   =1          # from enum CpriCWHandl
  74     CNF_L1_RES                    =2          # from enum CpriCWHandl
  75     CNF_REV_CW                    =0          # from enum CpriCWHandl
  76     CNF_Z144                      =3          # from enum CpriCWHandl
  77     HFNSYNC                       =4          # from enum CpriFrAlSt
  78     XACQ1                         =0          # from enum CpriFrAlSt
  79     XACQ2                         =1          # from enum CpriFrAlSt
  80     XSYNC1                        =2          # from enum CpriFrAlSt
  81     XSYNC2                        =3          # from enum CpriFrAlSt
  82     LINK_DIS                      =0          # from enum CpriLink
  83     RX_EN                         =1          # from enum CpriLink
  84     RX_TX_EN                      =3          # from enum CpriLink
  85     TX_EN                         =2          # from enum CpriLink
  86     LS_A                          =0          # from enum CpriLinkSt
  87     LS_B                          =1          # from enum CpriLinkSt
  88     LS_B_PL                       =2          # from enum CpriLinkSt
  89     LS_C                          =3          # from enum CpriLinkSt
  90     LS_C_PL                       =4          # from enum CpriLinkSt
  91     LS_D                          =5          # from enum CpriLinkSt
  92     LS_D_MIN                      =6          # from enum CpriLinkSt
  93     LS_F                          =7          # from enum CpriLinkSt
  94     LNK_ECP_EN                    =0          # from enum CpriLnkSrv
  95     LNK_ECP_IDL                   =1          # from enum CpriLnkSrv
  96     LNK_HDLC0_EN                  =4          # from enum CpriLnkSrv
  97     LNK_HDLC1_EN                  =5          # from enum CpriLnkSrv
  98     LNK_HDLC2_EN                  =6          # from enum CpriLnkSrv
  99     LNK_HDLC3_EN                  =7          # from enum CpriLnkSrv
 100     LNK_IQC_EN                    =2          # from enum CpriLnkSrv
 101     LNK_IQC_IDL                   =3          # from enum CpriLnkSrv
 102     MAST_RE                       =2          # from enum CpriMode
 103     MAST_REC                      =3          # from enum CpriMode
 104     PRIM_SLAVE                    =0          # from enum CpriMode
 105     SEC_SLAVE                     =1          # from enum CpriMode
 106     DECR                          =0          # from enum CpriPhShift
 107     INCR                          =1          # from enum CpriPhShift
 108     CHAN1_RECORD_PORT_A           =2          # from enum CpriRX
 109     CHAN1_RECORD_PORT_B           =3          # from enum CpriRX
 110     CHAN2_RECORD_PORT_A           =4          # from enum CpriRX
 111     CHAN2_RECORD_PORT_B           =5          # from enum CpriRX
 112     RX_CHA                        =0          # from enum CpriRX
 113     RX_CHB                        =1          # from enum CpriRX
 114     RATE_12                       =0          # from enum CpriRate
 115     RATE_25                       =1          # from enum CpriRate
 116     RATE_49                       =2          # from enum CpriRate
 117     RATE_98                       =3          # from enum CpriRate
 118     SR_096                        =1          # from enum CpriSampRate
 119     SR_1536                       =5          # from enum CpriSampRate
 120     SR_192                        =2          # from enum CpriSampRate
 121     SR_2304                       =6          # from enum CpriSampRate
 122     SR_3072                       =7          # from enum CpriSampRate
 123     SR_384                        =3          # from enum CpriSampRate
 124     SR_768                        =4          # from enum CpriSampRate
 125     SR_NONE                       =0          # from enum CpriSampRate
 126     SR_096DL                      =20         # from enum CpriSampRateDL
 127     SR_1536DL                     =3          # from enum CpriSampRateDL
 128     SR_192DL                      =21         # from enum CpriSampRateDL
 129     SR_2304DL                     =4          # from enum CpriSampRateDL
 130     SR_3072DL                     =5          # from enum CpriSampRateDL
 131     SR_384DL                      =1          # from enum CpriSampRateDL
 132     SR_768DL                      =2          # from enum CpriSampRateDL
 133     PACKED_CPRI                   =0          # from enum CpriSampleSrc
 134     RAW                           =3          # from enum CpriSampleSrc
 135     UL_CARRIER                    =1          # from enum CpriSampleSrc
 136     SY_AUTO_BFE                   =2          # from enum CpriSync
 137     SY_AUTO_TADV                  =3          # from enum CpriSync
 138     SY_INTERNAL                   =1          # from enum CpriSync
 139     SY_LINE                       =0          # from enum CpriSync
 140     TX_CHA                        =0          # from enum CpriTX
 141     TX_CHAB                       =2          # from enum CpriTX
 142     TX_CHB                        =1          # from enum CpriTX
 143     T_CDMA                        =4          # from enum CpriTech
 144     T_GSM                         =2          # from enum CpriTech
 145     T_LTE                         =0          # from enum CpriTech
 146     T_WCDMA                       =1          # from enum CpriTech
 147     T_WCDMA5bit                   =3          # from enum CpriTech
 148     TRIG1                         =0          # from enum CpriTrig
 149     TRIG2                         =1          # from enum CpriTrig
 150     CLK_122_0                     =3          # from enum CpriTrigSrc
 151     CLK_122_180                   =5          # from enum CpriTrigSrc
 152     CLK_122_270                   =6          # from enum CpriTrigSrc
 153     CLK_122_90                    =4          # from enum CpriTrigSrc
 154     CLK_122_SCAN                  =7          # from enum CpriTrigSrc
 155     CLK_31_SCAN                   =8          # from enum CpriTrigSrc
 156     CPC_TRIG                      =9          # from enum CpriTrigSrc
 157     CPRI_TIMING_TRIG              =12         # from enum CpriTrigSrc
 158     DYNAMIC_GAIN_TRIG             =11         # from enum CpriTrigSrc
 159     GSM_FRAMESYNC                 =10         # from enum CpriTrigSrc
 160     SCAN_DL_K                     =1          # from enum CpriTrigSrc
 161     SCAN_UL_K                     =2          # from enum CpriTrigSrc
 162     TRIG_INPUT                    =64         # from enum CpriTrigSrc
 163     TR_NONE                       =0          # from enum CpriTrigSrc
 164     NON_IDLE                      =0          # from enum CpriUlStart
 165     RADIO_FRAME                   =1          # from enum CpriUlStart
 166     EXTERNAL_TRIGGER              =3          # from enum CpriUlStartEx
 167     NON_IDLE_X                    =0          # from enum CpriUlStartEx
 168     RADIO_FRAME_X                 =1          # from enum CpriUlStartEx
 169     SAMPLE_0_STROBE               =2          # from enum CpriUlStartEx
 170     VERSION_1                     =1          # from enum CpriVersion
 171     VERSION_2                     =2          # from enum CpriVersion
 172     CPRI_LTE                      =1          # from enum DLFileType
 173     CPRI_LTE_UNPACKED             =4          # from enum DLFileType
 174     CPRI_TD_SCDMA                 =2          # from enum DLFileType
 175     CPRI_WCDMA                    =0          # from enum DLFileType
 176     CPRI_WCDMA_UNPACKED           =3          # from enum DLFileType
 177     GAMMA_DL                      =64         # from enum DLFileType
 178     NO_FILE                       =100        # from enum DLFileType
 179     UNKNOWN_DL                    =99         # from enum DLFileType
 180     DgcModeEdit                   =0          # from enum DgcMode
 181     DgcModeRun                    =1          # from enum DgcMode
 182     DgcModeRunActiveRow           =2          # from enum DgcMode
 183     WB_37_5                       =3          # from enum ElMixRatio
 184     WB_50                         =0          # from enum ElMixRatio
 185     WB_67_5                       =1          # from enum ElMixRatio
 186     WB_75                         =2          # from enum ElMixRatio
 187     POLE_0                        =0          # from enum ElPoleLoc
 188     POLE_M12_5                    =1          # from enum ElPoleLoc
 189     POLE_M25                      =2          # from enum ElPoleLoc
 190     POLE_M37_5                    =3          # from enum ElPoleLoc
 191     POLE_P12_5                    =4          # from enum ElPoleLoc
 192     POLE_P25                      =5          # from enum ElPoleLoc
 193     POLE_P37_5                    =6          # from enum ElPoleLoc
 194     POLE_P50                      =7          # from enum ElPoleLoc
 195     SWING_0                       =7          # from enum ElTxDiffSwing
 196     SWING_1000                    =2          # from enum ElTxDiffSwing
 197     SWING_1050                    =1          # from enum ElTxDiffSwing
 198     SWING_1100                    =0          # from enum ElTxDiffSwing
 199     SWING_400                     =6          # from enum ElTxDiffSwing
 200     SWING_600                     =5          # from enum ElTxDiffSwing
 201     SWING_800                     =4          # from enum ElTxDiffSwing
 202     SWING_900                     =3          # from enum ElTxDiffSwing
 203     PREEMPH_16                    =4          # from enum ElTxPreemph
 204     PREEMPH_2                     =0          # from enum ElTxPreemph
 205     PREEMPH_23                    =5          # from enum ElTxPreemph
 206     PREEMPH_2_5                   =1          # from enum ElTxPreemph
 207     PREEMPH_31                    =6          # from enum ElTxPreemph
 208     PREEMPH_4_5                   =2          # from enum ElTxPreemph
 209     PREEMPH_9_5                   =3          # from enum ElTxPreemph
 210     ALLWAYS                       =6          # from enum EvCondition
 211     BC                            =5          # from enum EvCondition
 212     BFN_TSC_SC_CC_BC              =1          # from enum EvCondition
 213     CC_BC                         =4          # from enum EvCondition
 214     NO_EV                         =0          # from enum EvCondition
 215     SC_CC_BC                      =3          # from enum EvCondition
 216     TSC_SC_CC_BC                  =2          # from enum EvCondition
 217     EVERYTIME                     =1          # from enum EvControl
 218     FIRST_TIME                    =0          # from enum EvControl
 219     EV1                           =1          # from enum EventNo
 220     EV2                           =2          # from enum EventNo
 221     EV3                           =3          # from enum EventNo
 222     EV4                           =4          # from enum EventNo
 223     FPGA1                         =0          # from enum Fpga
 224     FPGA2                         =1          # from enum Fpga
 225     Downlink                      =1          # from enum GSMTiming
 226     Even                          =2          # from enum GSMTiming
 227     AGC_A                         =0          # from enum GamAGC
 228     AGC_B                         =2          # from enum GamAGC
 229     ID_A                          =1          # from enum GamAGC
 230     ID_B                          =3          # from enum GamAGC
 231     FUNCGEN                       =2          # from enum GamDataSrc
 232     MEMORY                        =1          # from enum GamDataSrc
 233     PATTGEN                       =0          # from enum GamDataSrc
 234     EMPTY                         =1          # from enum GamStatus
 235     FULL                          =0          # from enum GamStatus
 236     PAR_ERR                       =2          # from enum GamStatus
 237     RX_CH1                        =0          # from enum GammaRX
 238     RX_CH2                        =1          # from enum GammaRX
 239     RX_CH3                        =2          # from enum GammaRX
 240     RX_CH4                        =3          # from enum GammaRX
 241     TX_CH1                        =0          # from enum GammaTX
 242     TX_CH1_3                      =2          # from enum GammaTX
 243     TX_CH3                        =1          # from enum GammaTX
 244     BITRATE_115_2                 =2          # from enum HDLCUart
 245     BITRATE_38_4                  =1          # from enum HDLCUart
 246     BITRATE_460_8                 =3          # from enum HDLCUart
 247     BITRATE_9_6                   =0          # from enum HDLCUart
 248     IQMAN_DISABLE                 =0          # from enum IQManCtrl
 249     IQ_EVERY_EV                   =2          # from enum IQManCtrl
 250     ONLY_FIRST_EV                 =1          # from enum IQManCtrl
 251     BFN                           =10         # from enum IQManPin
 252     IA_QA_0                       =4          # from enum IQManPin
 253     IA_QA_1                       =3          # from enum IQManPin
 254     IA_QA_2                       =2          # from enum IQManPin
 255     IA_QA_3                       =1          # from enum IQManPin
 256     IB_QB_0                       =8          # from enum IQManPin
 257     IB_QB_1                       =7          # from enum IQManPin
 258     IB_QB_2                       =6          # from enum IQManPin
 259     IB_QB_3                       =5          # from enum IQManPin
 260     ID_PARITY                     =0          # from enum IQManPin
 261     STB                           =9          # from enum IQManPin
 262     DONOTHING                     =0          # from enum IQManType
 263     INV_SEL_BIT                   =1          # from enum IQManType
 264     REPLACE                       =2          # from enum IQManType
 265     CPRI                          =1          # from enum IfType
 266     GAMMA                         =0          # from enum IfType
 267     LOG_ALL                       =4          # from enum OAndMLogType
 268     LOG_COM                       =0          # from enum OAndMLogType
 269     LOG_DEBUG                     =2          # from enum OAndMLogType
 270     LOG_EVENT                     =3          # from enum OAndMLogType
 271     LOG_SIGNAL                    =1          # from enum OAndMLogType
 272     PN_I                          =0          # from enum PN_Select
 273     PN_Q                          =1          # from enum PN_Select
 274     PARALLEL                      =0          # from enum PattGenCtrl
 275     TIME_MUX                      =1          # from enum PattGenCtrl
 276     FG_TO_SCB1                    =1          # from enum PgDest
 277     FG_TO_SCB1_SCB2               =3          # from enum PgDest
 278     FG_TO_SCB2                    =2          # from enum PgDest
 279     ZERO_TO_SCB1_SCB2             =0          # from enum PgDest
 280     IQ_CONSTANT                   =0          # from enum PgSource
 281     PN_GENERATOR                  =1          # from enum PgSource
 282     db_0_15                       =0          # from enum RX_EQUALIZER
 283     db_0_36                       =1          # from enum RX_EQUALIZER
 284     db_0_74                       =2          # from enum RX_EQUALIZER
 285     db_0_96                       =3          # from enum RX_EQUALIZER
 286     db_1_98                       =4          # from enum RX_EQUALIZER
 287     db_2_19                       =5          # from enum RX_EQUALIZER
 288     db_2_71                       =6          # from enum RX_EQUALIZER
 289     db_2_88                       =7          # from enum RX_EQUALIZER
 290     db_4_15                       =8          # from enum RX_EQUALIZER
 291     db_4_32                       =9          # from enum RX_EQUALIZER
 292     db_4_46                       =10         # from enum RX_EQUALIZER
 293     db_4_79                       =11         # from enum RX_EQUALIZER
 294     db_5_20                       =12         # from enum RX_EQUALIZER
 295     db_5_34                       =13         # from enum RX_EQUALIZER
 296     db_5_54                       =14         # from enum RX_EQUALIZER
 297     db_5_67                       =15         # from enum RX_EQUALIZER
 298     BER_LOS                       =22         # from enum ReAlarm
 299     BIT_ERR                       =29         # from enum ReAlarm
 300     BIT_ERR_IRQ                   =9          # from enum ReAlarm
 301     CASC_MIS                      =14         # from enum ReAlarm
 302     CASC_W                        =13         # from enum ReAlarm
 303     DELAY                         =28         # from enum ReAlarm
 304     DEL_CNT_IRQ                   =5          # from enum ReAlarm
 305     ECP_LINK                      =8          # from enum ReAlarm
 306     FA_FSM_LOF                    =23         # from enum ReAlarm
 307     FSM_N_F                       =19         # from enum ReAlarm
 308     HDLC_PFA                      =30         # from enum ReAlarm
 309     INB_L1_RES                    =0          # from enum ReAlarm
 310     INB_LOF                       =4          # from enum ReAlarm
 311     INB_LOS                       =3          # from enum ReAlarm
 312     INB_RAI                       =1          # from enum ReAlarm
 313     INB_SDI                       =2          # from enum ReAlarm
 314     IQC_LINK                      =7          # from enum ReAlarm
 315     IQ_LINK                       =6          # from enum ReAlarm
 316     JIT_BUF                       =25         # from enum ReAlarm
 317     L1_RES                        =26         # from enum ReAlarm
 318     LOF_SW                        =27         # from enum ReAlarm
 319     MAX_LR_CH                     =12         # from enum ReAlarm
 320     M_S_CONF                      =18         # from enum ReAlarm
 321     PORT_LOS                      =21         # from enum ReAlarm
 322     PORT_NC                       =20         # from enum ReAlarm
 323     REV_CH                        =17         # from enum ReAlarm
 324     REV_FAULT                     =16         # from enum ReAlarm
 325     RE_BFN                        =10         # from enum ReAlarm
 326     RE_HFN                        =11         # from enum ReAlarm
 327     SDI                           =24         # from enum ReAlarm
 328     VER_FAULT                     =15         # from enum ReAlarm
 329     EXTERNAL                      =1          # from enum RefSource
 330     INTERNAL                      =0          # from enum RefSource
 331     LTU_LOCK_AL                   =0          # from enum RumaHWAlarms
 332     SFP1                          =0          # from enum SFP
 333     SFP2                          =1          # from enum SFP
 334     SCAN1                         =0          # from enum Scan
 335     SCAN2                         =1          # from enum Scan
 336     NO_COMMA                      =2          # from enum ScanAlarm
 337     SC_LOS                        =0          # from enum ScanAlarm
 338     UNLOCK                        =1          # from enum ScanAlarm
 339     LB_NONE                       =0          # from enum ScanLB
 340     LINE                          =1          # from enum ScanLB
 341     LOCAL                         =2          # from enum ScanLB
 342     SPEC                          =3          # from enum ScanLB
 343     SRATE_06                      =1          # from enum ScanRate
 344     SRATE_12                      =2          # from enum ScanRate
 345     SRATE_25                      =3          # from enum ScanRate
 346     SRATE_MDIO                    =0          # from enum ScanRate
 347     LOW                           =1          # from enum ScanTxRx
 348     MAX                           =3          # from enum ScanTxRx
 349     MEDIUM                        =2          # from enum ScanTxRx
 350     NONE                          =0          # from enum ScanTxRx
 351     SFP_LOS                       =0          # from enum SfpAlarm
 352     TX_FAULT                      =1          # from enum SfpAlarm
 353     SUBFRAME_0                    =0          # from enum SubFrame_e
 354     SUBFRAME_1                    =1          # from enum SubFrame_e
 355     SUBFRAME_2                    =2          # from enum SubFrame_e
 356     SUBFRAME_3                    =3          # from enum SubFrame_e
 357     SUBFRAME_4                    =4          # from enum SubFrame_e
 358     SUBFRAME_5                    =5          # from enum SubFrame_e
 359     SUBFRAME_6                    =6          # from enum SubFrame_e
 360     SUBFRAME_7                    =7          # from enum SubFrame_e
 361     SUBFRAME_8                    =8          # from enum SubFrame_e
 362     SUBFRAME_9                    =9          # from enum SubFrame_e
 363     SUBFRAME_ALL                  =-1         # from enum SubFrame_e
 364     SWNG_1000                     =5          # from enum Swing_CT10
 365     SWNG_1100                     =6          # from enum Swing_CT10
 366     SWNG_1200                     =7          # from enum Swing_CT10
 367     SWNG_450                      =0          # from enum Swing_CT10
 368     SWNG_600                      =1          # from enum Swing_CT10
 369     SWNG_700                      =2          # from enum Swing_CT10
 370     SWNG_800                      =3          # from enum Swing_CT10
 371     SWNG_900                      =4          # from enum Swing_CT10
 372     db_0                          =0          # from enum TX_PRECURSOR_CT10
 373     db_0_75                       =1          # from enum TX_PRECURSOR_CT10
 374     db_1_5                        =2          # from enum TX_PRECURSOR_CT10
 375     db_2_5                        =3          # from enum TX_PRECURSOR_CT10
 376     db_3_5                        =4          # from enum TX_PRECURSOR_CT10
 377     db_4_5                        =5          # from enum TX_PRECURSOR_CT10
 378     db_6                          =6          # from enum TX_PRECURSOR_CT10
 379     MUX_0                         =3          # from enum TrigMux
 380     MUX_1                         =4          # from enum TrigMux
 381     MUX_31MHZ                     =5          # from enum TrigMux
 382     MUX_CPRI1                     =0          # from enum TrigMux
 383     MUX_CPRI2                     =1          # from enum TrigMux
 384     MUX_GAMMA                     =2          # from enum TrigMux
 385     BFNCH1                        =7          # from enum TrigSrc
 386     BFNCH3                        =8          # from enum TrigSrc
 387     RXCH1                         =1          # from enum TrigSrc
 388     RXCH2                         =2          # from enum TrigSrc
 389     RXCH3                         =3          # from enum TrigSrc
 390     RXCH4                         =4          # from enum TrigSrc
 391     TXCH1                         =5          # from enum TrigSrc
 392     TXCH3                         =6          # from enum TrigSrc
 393     LTE                           =1          # from enum UmtsType
 394     TD_SCDMA                      =2          # from enum UmtsType
 395     WCDMA                         =0          # from enum UmtsType
 396     BOTH                          =0          # from enum WcdmaSample
 397     SAMPLE_0                      =1          # from enum WcdmaSample
 398     SAMPLE_1                      =2          # from enum WcdmaSample
 399 
 400 from win32com.client import DispatchBaseClass
 401 class IRuControl1(DispatchBaseClass):
 402     ‘IRuControl1 Interface‘
 403     CLSID = IID(‘{A3676616-2626-430A-ABAE-0186181F5846}‘)
 404     coclass_clsid = IID(‘{75BF5D19-5AB0-4004-97EE-F039164681A3}‘)
 405 
 406     def BBCLK_Blanking(self, chain=defaultNamedNotOptArg, src=defaultNamedNotOptArg, clk_cycles=defaultNamedNotOptArg, clock=defaultNamedNotOptArg):
 407         ‘method BBCLK_Blanking‘
 408         return self._oleobj_.InvokeTypes(37, LCID, 1, (24, 0), ((3, 1), (3, 1), (3, 1), (3, 1)),chain
 409             , src, clk_cycles, clock)
 410 
 411     def BBCLK_Manipulation(self, chain=defaultNamedNotOptArg, clk_phase=defaultNamedNotOptArg):
 412         ‘method BBCLK_Manipulation‘
 413         return self._oleobj_.InvokeTypes(36, LCID, 1, (17, 0), ((3, 1), (3, 1)),chain
 414             , clk_phase)
 415 
 416     def BFN_Offset(self, offset=defaultNamedNotOptArg):
 417         ‘method BFN_Offset‘
 418         return self._oleobj_.InvokeTypes(15, LCID, 1, (24, 0), ((3, 1),),offset
 419             )
 420 
 421     def DL_BFN_Control(self, chain=defaultNamedNotOptArg, mode=defaultNamedNotOptArg, StartBit1=defaultNamedNotOptArg, StartBit2=defaultNamedNotOptArg):
 422         ‘method DL_BFN_Control‘
 423         return self._oleobj_.InvokeTypes(25, LCID, 1, (24, 0), ((3, 1), (3, 1), (11, 1), (11, 1)),chain
 424             , mode, StartBit1, StartBit2)
 425 
 426     def DL_BFN_OffsNum(self, chain=defaultNamedNotOptArg, TSC=defaultNamedNotOptArg, SC=defaultNamedNotOptArg, CC=defaultNamedNotOptArg
 427             , BC=defaultNamedNotOptArg):
 428         ‘method DL_BFN_OffsNum‘
 429         return self._oleobj_.InvokeTypes(23, LCID, 1, (24, 0), ((3, 1), (17, 1), (17, 1), (18, 1), (17, 1)),chain
 430             , TSC, SC, CC, BC)
 431 
 432     def DL_BFN_Offset(self, chain=defaultNamedNotOptArg, TSC=defaultNamedNotOptArg, SC=defaultNamedNotOptArg, CC=defaultNamedNotOptArg
 433             , BC=defaultNamedNotOptArg, control=defaultNamedNotOptArg, event=defaultNamedNotOptArg):
 434         ‘method DL_BFN_Offset‘
 435         return self._oleobj_.InvokeTypes(26, LCID, 1, (24, 0), ((3, 1), (17, 1), (17, 1), (18, 1), (17, 1), (3, 1), (3, 1)),chain
 436             , TSC, SC, CC, BC, control
 437             , event)
 438 
 439     def DL_BFN_Update(self, chain=defaultNamedNotOptArg, src=defaultNamedNotOptArg, ctrl=defaultNamedNotOptArg, Number=defaultNamedNotOptArg):
 440         ‘method DL_BFN_Update‘
 441         return self._oleobj_.InvokeTypes(24, LCID, 1, (24, 0), ((3, 1), (3, 1), (3, 1), (19, 1)),chain
 442             , src, ctrl, Number)
 443 
 444     def DL_EventControl(self, chain=defaultNamedNotOptArg, ev=defaultNamedNotOptArg, cond=defaultNamedNotOptArg, ctrl=defaultNamedNotOptArg):
 445         ‘method DL_EventControl‘
 446         return self._oleobj_.InvokeTypes(28, LCID, 1, (24, 0), ((3, 1), (3, 1), (3, 1), (3, 1)),chain
 447             , ev, cond, ctrl)
 448 
 449     def DL_EventCount(self, chain=defaultNamedNotOptArg, ev=defaultNamedNotOptArg, BFN=defaultNamedNotOptArg, TSC=defaultNamedNotOptArg
 450             , SC=defaultNamedNotOptArg, CC=defaultNamedNotOptArg, BC=defaultNamedNotOptArg):
 451         ‘method DL_EventCount‘
 452         return self._oleobj_.InvokeTypes(27, LCID, 1, (24, 0), ((3, 1), (3, 1), (18, 1), (17, 1), (17, 1), (18, 1), (17, 1)),chain
 453             , ev, BFN, TSC, SC, CC
 454             , BC)
 455 
 456     def DL_GammaCarrier(self, chain=defaultNamedNotOptArg, CarrierID_A=defaultNamedNotOptArg, CarrierID_B=defaultNamedNotOptArg):
 457         ‘method DL_GammaCarrier‘
 458         return self._oleobj_.InvokeTypes(22, LCID, 1, (24, 0), ((3, 1), (17, 1), (17, 1)),chain
 459             , CarrierID_A, CarrierID_B)
 460 
 461     def DL_GammaDataSrc(self, chain=defaultNamedNotOptArg, Source=defaultNamedNotOptArg):
 462         ‘method DL_GammaDataSrc‘
 463         return self._oleobj_.InvokeTypes(21, LCID, 1, (24, 0), ((3, 1), (3, 1)),chain
 464             , Source)
 465 
 466     def DL_GammaScale(self, chain=defaultNamedNotOptArg, factor_A_dB=defaultNamedNotOptArg, factor_B_dB=defaultNamedNotOptArg):
 467         ‘method DL_GammaScale‘
 468         return self._oleobj_.InvokeTypes(29, LCID, 1, (24, 0), ((3, 1), (5, 1), (5, 1)),chain
 469             , factor_A_dB, factor_B_dB)
 470 
 471     def DL_Strobe_Offset(self, chain=defaultNamedNotOptArg, TSC=defaultNamedNotOptArg, SC=defaultNamedNotOptArg, CC=defaultNamedNotOptArg
 472             , BC=defaultNamedNotOptArg, event=defaultNamedNotOptArg):
 473         ‘method DL_Strobe_Offset‘
 474         return self._oleobj_.InvokeTypes(38, LCID, 1, (24, 0), ((3, 1), (17, 1), (17, 1), (18, 1), (17, 1), (3, 1)),chain
 475             , TSC, SC, CC, BC, event
 476             )
 477 
 478     def ExtReferenceLock(self):
 479         ‘method ExtReferenceLock‘
 480         return self._oleobj_.InvokeTypes(7, LCID, 1, (11, 0), (),)
 481 
 482     def ExternalPatternGen(self, input=defaultNamedNotOptArg):
 483         ‘method ExternalPatternGen‘
 484         return self._oleobj_.InvokeTypes(10, LCID, 1, (24, 0), ((3, 1),),input
 485             )
 486 
 487     def ExternalTrig(self, dstrb_src=defaultNamedNotOptArg, TSC=defaultNamedNotOptArg, SC=defaultNamedNotOptArg, CC=defaultNamedNotOptArg
 488             , BC=defaultNamedNotOptArg):
 489         ‘method ExternalTrig‘
 490         return self._oleobj_.InvokeTypes(14, LCID, 1, (24, 0), ((3, 1), (17, 1), (17, 1), (18, 1), (17, 1)),dstrb_src
 491             , TSC, SC, CC, BC)
 492 
 493     def FG_GammaConstant(self, chain=defaultNamedNotOptArg, Constant_I=defaultNamedNotOptArg, Constant_Q=defaultNamedNotOptArg):
 494         ‘method FG_GammaConstant‘
 495         return self._oleobj_.InvokeTypes(31, LCID, 1, (24, 0), ((3, 1), (17, 1), (17, 1)),chain
 496             , Constant_I, Constant_Q)
 497 
。。。。。。。。。。。。。。。。。。。。。此处省略许多行。。。。。。。。。。。。。。。。。。。。。
3256 
3257 _Object_vtables_dispatch_ = 1
3258 _Object_vtables_ = [
3259     (( ‘ToString‘ , ‘pRetVal‘ , ), 0, (0, (), [ (16392, 10, None, None) , ], 1 , 2 , 4 , 0 , 28 , (3, 0, None, None) , 0 , )),
3260     (( ‘Equals‘ , ‘obj‘ , ‘pRetVal‘ , ), 1610743809, (1610743809, (), [ (12, 1, None, None) , 
3261              (16395, 10, None, None) , ], 1 , 1 , 4 , 0 , 32 , (3, 0, None, None) , 0 , )),
3262     (( ‘GetHashCode‘ , ‘pRetVal‘ , ), 1610743810, (1610743810, (), [ (16387, 10, None, None) , ], 1 , 1 , 4 , 0 , 36 , (3, 0, None, None) , 0 , )),
3263     (( ‘GetType‘ , ‘pRetVal‘ , ), 1610743811, (1610743811, (), [ (16397, 10, None, "IID(‘{BCA8B44D-AAD6-3A86-8AB7-03349F4F2DA2}‘)") , ], 1 , 1 , 4 , 0 , 40 , (3, 0, None, None) , 0 , )),
3264 ]
3265 
3266 RecordMap = {
3267 }
3268 
3269 CLSIDToClassMap = {
3270     ‘{03589009-265A-4FA8-A3F7-081CDB2DD05A}‘ : IRuControl3,
3271     ‘{982D3D23-1181-4907-A770-1DAF6979883F}‘ : IRuControl4,
3272     ‘{75BF5D19-5AB0-4004-97EE-F039164681A3}‘ : RuControl,
3273     ‘{A3676616-2626-430A-ABAE-0186181F5846}‘ : IRuControl1,
3274     ‘{5C05EA90-661D-11D5-A4BC-00608CF21B5F}‘ : IRuControl2,
3275     ‘{65074F7F-63C0-304E-AF0A-D51741CB4A8D}‘ : _Object,
3276 }
3277 CLSIDToPackageMap = {}
3278 win32com.client.CLSIDToClass.RegisterCLSIDsFromDict( CLSIDToClassMap )
3279 VTablesToPackageMap = {}
3280 VTablesToClassMap = {
3281     ‘{03589009-265A-4FA8-A3F7-081CDB2DD05A}‘ : ‘IRuControl3‘,
3282     ‘{65074F7F-63C0-304E-AF0A-D51741CB4A8D}‘ : ‘_Object‘,
3283     ‘{982D3D23-1181-4907-A770-1DAF6979883F}‘ : ‘IRuControl4‘,
3284     ‘{5C05EA90-661D-11D5-A4BC-00608CF21B5F}‘ : ‘IRuControl2‘,
3285     ‘{A3676616-2626-430A-ABAE-0186181F5846}‘ : ‘IRuControl1‘,
3286 }
3287 
3288 
3289 NamesToIIDMap = {
3290     ‘IRuControl4‘ : ‘{982D3D23-1181-4907-A770-1DAF6979883F}‘,
3291     ‘_Object‘ : ‘{65074F7F-63C0-304E-AF0A-D51741CB4A8D}‘,
3292     ‘IRuControl2‘ : ‘{5C05EA90-661D-11D5-A4BC-00608CF21B5F}‘,
3293     ‘IRuControl3‘ : ‘{03589009-265A-4FA8-A3F7-081CDB2DD05A}‘,
3294     ‘IRuControl1‘ : ‘{A3676616-2626-430A-ABAE-0186181F5846}‘,
3295 }
3296 
3297 win32com.client.constants.__dicts__.append(constants.__dict__)


View Code

其中,从Py接口文件头部信息部分代码中可以查看到基本信息,以及一些重要参数(CLSID/LCID/Major/Minor等)。


1 # -*- coding: mbcs -*-  
 2 # Created by makepy.py version 0.5.01  
 3 # By python version 3.4.4 (v3.4.4:737efcadf5a6, Dec 20 2015, 19:28:18) [MSC v.1600 32 bit (Intel)]  
 4 # From type library ‘RuMasterLib.tlb‘  
 5 # On Thu Oct 12 22:28:05 2017  
 6 ‘RU Master 2.20 Type Library‘  
 7 makepy_version = ‘0.5.01‘  
 8 python_version = 0x30404f0  
 9   
10 import win32com.client.CLSIDToClass, pythoncom, pywintypes  
11 import win32com.client.util  
12 from pywintypes import IID  
13 from win32com.client import Dispatch  
14   
15 # The following 3 lines may need tweaking for the particular server  
16 # Candidates are pythoncom.Missing, .Empty and .ArgNotFound  
17 defaultNamedOptArg=pythoncom.Empty  
18 defaultNamedNotOptArg=pythoncom.Empty  
19 defaultUnnamedArg=pythoncom.Empty  
20   
21 CLSID = IID(‘{2C485B34-1437-4F59-8128-C387F8E8147B}‘)  
22 MajorVersion = 1  
23 MinorVersion = 0  
24 LibraryFlags = 8  
25 LCID = 0x0


而Py接口文件的最后一个类(基类为CoClassBaseClass),通常包含则真正调用的dll文件的信息,同时也是最终使用的dll文件的类对象。

可以看到,这个类的CLSID与对应的COM/DLL文件的CLSID(可通过OleViewer查看)是相同的,同时也可以看到这个类的名称(RuMaster.RuControl)。


1 from win32com.client import CoClassBaseClass  
 2 # This CoClass is known by the name ‘RuMaster.RuControl‘  
 3 class RuControl(CoClassBaseClass): # A CoClass  
 4     # RuControl Class  
 5     CLSID = IID(‘{75BF5D19-5AB0-4004-97EE-F039164681A3}‘)  
 6     coclass_sources = [  
 7     ]  
 8     coclass_interfaces = [  
 9         IRuControl3,  
10         IRuControl1,  
11         IRuControl4,  
12         IRuControl2,  
13         _Object,  
14     ]  
15     default_interface = IRuControl4


 

1.3 生成COM组件对象实例

到目前为止已经生成了一个中间层用于与COM/DLL进行交互,此时利用代码将这个中间层导入并生成对象实例来使用它。

完整代码

com组件 vb和python python调用com组件_com组件 vb和python_03


1 from win32com import client  
 2 
 3 interface = client.gencache.EnsureModule("{2C485B34-1437-4F59-8128-C387F8E8147B}", 0x0, 1, 0)  
 4   
 5 # interface.RuControl: <class ‘win32com.gen_py.2C485B34-1437-4F59-8128-C387F8E8147Bx0x1x0.RuControl‘>  
 6 ru_control = interface.RuControl()  
 7 # Use below code to generate instance directly without via py interface  
 8 # ru_control = client.Dispatch("RuMaster.RuControl")  
 9 # ru_control = client.Dispatch("{75BF5D19-5AB0-4004-97EE-F039164681A3}")  
10 
11 # Note: Hardware is required to generate above instance, otherwise an error raised as below shows,  
12 # pywintypes.com_error: (-2147024894, ‘The system cannot find the file specified.‘, None, None)  
13 
14 # Call inside function  
15 ru_control.MasterReady()


View Code

分段分析

首先导入win32com的client模块,


1 from win32com import client


此时有两种方式进行组件的实例化,第一种是利用中间层,即通过makepy生成的接口文件来实例化,具体方式如下,利用文件中提供的参数(CLSID/LCID/Major/Minor),按顺序传入函数中,此时生成的实例实际上是由中间层接口得到的。再利用这个中间层实例得到所需要使用的dll文件的实例(实际上此处完成的也是利用dll文件的id码生成实例)。


1 interface = client.gencache.EnsureModule("{2C485B34-1437-4F59-8128-C387F8E8147B}", 0x0, 1, 0)  
2   
3 # interface.RuControl: <class ‘win32com.gen_py.2C485B34-1437-4F59-8128-C387F8E8147Bx0x1x0.RuControl‘>  
4 ru_control = interface.RuControl()


当然,也可以绕开上面的中间直接生成所需要的实例,即通过COM组件的dll文件本身的CLSID/UUID码或注册名称来生成。方法如下,


1 # Use below code to generate instance directly without via py interface  
2 # ru_control = client.Dispatch("RuMaster.RuControl")  
3 # ru_control = client.Dispatch("{75BF5D19-5AB0-4004-97EE-F039164681A3}")


此处若提示如下报错,则可能是硬件不存在导致的无法找到文件,从而无法生成实例,


1 # Note: Hardware is required to generate above instance, otherwise an error raised as below shows,  
2 # pywintypes.com_error: (-2147024894, ‘The system cannot find the file specified.‘, None, None)


最后,利用生成的实例即可以调用内部的函数了。


1 # Call inside function  
2 ru_control.MasterReady()


 

2 使用comtypes

这里利用另外一个comtypes来实现对COM组件的调用。

2.1 环境搭建

利用pip安装所需要的comtypes包,


1 pip install comtypes


 

2.2 生成COM组件对象实例

利用comtypes包可以直接对COM组件进行对象创建,不通过中间层,类似于win32com的dispatch,使用方式如下,


from comtypes.client import CreateObject

# ru_control = CreateObject("RuMaster.RuControl")
ru_control = CreateObject("{75BF5D19-5AB0-4004-97EE-F039164681A3}")

ru_control.MasterReady()