组件对象模型 COM 的 Python 调用
关于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. 此时会弹出一个窗口,用于选择需要转换的控件;
4. 选择完毕后会显示如下提示,找到提示目录下的py文件,可以打开查看;
5. py接口文件中会显示一些基本信息,以及内部的接口函数,
转换后的中间层文件完整代码如下,
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进行交互,此时利用代码将这个中间层导入并生成对象实例来使用它。
完整代码
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()
相关阅读
1. 动态链接库及辅助工具
参考链接
https://zhidao.baidu.com/question/456627571.html
Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用
标签:patch viewer alc ida 需要 mac 1.2 cli imp
原文地址:https://www.cnblogs.com/stacklike/p/8278996.html