关于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()