i|ndZddlZddlmZddlmZddlZddlZddl Z ddl m Z ddl m Z dZdZdZe je je je je jgZejejejejgZdZd ZejejZ ejej!Z"e#e fZ$ej%fd Z&d Z'd Z(dddej%fd Z)dZ*ddej%fdZ+GddZ,dS)a8Support for dynamic COM client support. Introduction Dynamic COM client support is the ability to use a COM server without prior knowledge of the server. This can be used to talk to almost all COM servers, including much of MS Office. In general, you should not use this module directly - see below. Example >>> import win32com.client >>> xl = win32com.client.Dispatch("Excel.Application") # The line above invokes the functionality of this class. # xl is now an object we can use to talk to Excel. >>> xl.Visible = 1 # The Excel window becomes visible. N)chain) MethodType)IIDType)buildc`tr&|D]}t|dtdSdSN )end) debuggingprintargsargs EC:\PYTHON\_runtimes\venv\Lib\site-packages\win32com/client/dynamic.py debug_printr6sF  C #3      c`tr&|D]}t|dtdSdSr )debugging_attrr rs rdebug_attr_printr=sF  C #3      rct|tr|St|trL tj|}nG#tj$r$tj|d|tj}YnwxYwt|d|}|SN_oleobj_) isinstancePyIDispatchType_GoodDispatchTypes pythoncomconnect ole_errorCoCreateInstance IID_IDispatchgetattr) IDispatchclsctxs r_GetGoodDispatchr%Ks)_--)/00 > !))44II"   !24)@III  Iz9== sA0A65A6cx|t|tr|}nt|}t|||fSN)rstrr%)r#userNamer$s r_GetGoodDispatchAndUserNamer*\sD i % % ! Hx== Y / / ::rch|r|js|S|jjtjkr|S|jjSr')descdesckindrDESCKIND_VARDESCinvkind)entry invoke_types r_GetDescInvokeTyper2hsA   zi888 : rc@t|||\}}|t}d} ||}|/ |}||f}n#tj$rYnwxYwn#tj$rd}YnwxYwt |||}|||||S)N)lazydata)r* CDispatch GetTypeInfo GetTypeCompr com_error MakeOleRepr)r#r) createClasstypeinfor$r4typecompolereprs rDispatchr>xs6i6RRIx H    ,,..H   #//11#X-&      )Xx88G ;y'8h G G GGs4A)AA)A%"A)$A%%A))A=<A=cd}| |}|dtjkrS|dtjzr>|d}||}|}|t j||dd}nt j|d}n#tj $rYnwxYw|t j}|S)N r) GetTypeAttrrTKIND_INTERFACETYPEFLAG_FDUALGetRefTypeOfImplTypeGetRefTypeInfor DispatchItemLazyDispatchItemr)r#r;r<r=attrhrefs rr9r9sG ''))DQ9444Hy775  44R88#22488++--,XtT1EE0t<<"    D $&& NsB,B33CCcxt|||\}}|t}||tj|S)zDispatch with no type info)r*r5rrH)r#r)r:r$s r DumbDispatchrMsB6i6RRIx ;y%"4"6"6 A AArceZdZd dZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZdZ d dZd dZd dZdZdZdZdZdZdZdZdZdZdZ dS)!r5Nc|d}||jd<||jd<||jd<i|jd<i|jd<d|jd<d|jd<||jd <dS) Nz r _username_ _olerepr__mapCachedItems__builtMethods__enum__unicode_to_string_ _lazydata_)__dict__)selfr#r=r)r4s r__init__zCDispatch.__init__sv  "H$- j!&. l#%, k",. ()*, &'"& h/3 +,&. l###rcD|jjr#||jj\}}n%tjtjztj}}|<|t|df|z}||j j ||jjdStd)zJProvide 'default dispatch' COM functionality - allow instance to be calledNr5This dispatch object does not define a default method) rQdefaultDispatchName_find_dispatch_type_rDISPATCH_METHODDISPATCH_PROPERTYGET DISPID_VALUELCID_get_good_object_rInvoke TypeError)rXrr/dispidallArgss r__call__zCDispatch.__call__s > - "772OGVV )I,JJ&G  tWa047G))$ $g.0RTX OPPPrcdS)NTrXs r__bool__zCDispatch.__bool__strcd|jzS)N)rPrjs r__repr__zCDispatch.__repr__s4?33rc t|S#tj$r-}|jt vr|cYd}~Sd}~wwxYwr')r(rgrr8hresultERRORS_BAD_CONTEXTrn)rXdetailss r__str__zCDispatch.__str__sm #t}}'' '" # # #&888==?? " " " " " " #s #A"AAAct|jt|j|} t|d|jD}n#t $rYnwxYwtt|S)Ncg|] }|j Sri)Name).0ps r z%CDispatch.__dir__..s+M+M+MqAF+M+M+Mr) rrWdir __class__ _dir_ole_ Properties_AttributeErrorlistset)rX attributess r__dir__zCDispatch.__dir__s4=#dn*=*=t~~?O?OPP  z+M+MD>qAGj00.2 7+"'q(*=!>!>22I'< - "772OGVV .1RR&G  tWa7$>G))$ $g.0RTX OPPPrcR||jjvr&|jj|}|jd|jfS||jjvr&|jj|}|jd|jfS |jd|}n#YdSxYwtjtj z|fS)NrNN) rQmapFuncsr,re propMapGetr GetIDsOfNamesrr^r_)rX methodNameitemres rr]zCDispatch._find_dispatch_type_Ts 0 0 0>*:6D9Q<, , 2 2 2>,Z8D9Q<, , ]00J??FF ::(9+II6QQs *BB ch|jj|t|||f|z}||||Sr')rrrarb) rXrewFlagsretTypeargTypesuser resultCLSIDrresults r _ApplyTypes_zCDispatch._ApplyTypes_cs@**dFGX 6 = %%fdK@@@rc"t||Sr')r>)rXobr) returnCLSIDs r_wrap_dispatch_zCDispatch._wrap_dispatch_isH%%%rc&t|tr||||St|trO |t j}n#t j$r|cYSwxYw||||S|Sr')rrrPyIUnknownTypeQueryInterfacerr!r8rXrr) ReturnCLSIDs r_get_good_single_object_z"CDispatch._get_good_single_object_rs b/ * * C''HkBB B b. ) ) C &&y'>??&     ''HkBB B sA##A76A7c|dSt|tr"tt|||fd|S||S)zGiven an object (usually the retval from a method), make it a good object to return. Basically checks if it is a COM object, and wraps it up. Also handles the fact that a retval may be a tuple of retvalsNc0||||Sr')r)osounrcs rz-CDispatch._get_good_object_..s%&$>$>q#r$J$Jr)rtuplemaprrs rrbzCDispatch._get_good_object_su :4 E " " 5 "KKK  0044 4rctj|}|j|jj||d}d|} t |d|jzd}i}t }tj j |d<t||||}||x}|j|<t||S#t!d|t#jYnxYwdS)z1Make a method object - Assumes in olerepr funcmapr rmexecr>z'Error building OLE definition for code N)rMakePublicAttributeNamerQMakeFuncMethodrjoincompilerPglobalscopywin32comclientr>rrSrr traceback print_exc) rXnamermethodCodeList methodCode codeObject tempNameSpace globNameSpacefns r _make_method_zCDispatch._make_method_s2488 66 N #D ):q  YY~..  "!-=-OQWXXJM#IINN,,M(0(@M* % M=   D-:4-@ @B$T*b$'' ' " A: N N N   ! ! ! ! !ts BC%Dc|jD]}|i|_|jr#|jd|jd<|jr d|jd<d|_dS)ztCleanup object - like a close - to force cleanup when you don't want to rely on Python's reference counting.NrrQ)rRvalues _Release_rReleaserWrQrT)rX childConts rrzCDispatch._Release_s.5577 " "I    ! ! ! ! " = - M ! ! # # #(,DM* % > .)-DM+ & rc |jj|}|j}||jj|t |jddf|zS#t$rt|wxYw)zCall the named method as a procedure, rather than function. Mainly used by Word.Basic, which whinges about such things.rr) rQrrerbrrcrar,KeyErrorr~)rXrrrdispIds r_proc_zCDispatch._proc_s '>*40D[F))$ $vtTYq\1&E&NO  ' ' ' && & 's AAA.c td|j td|jjD]}td|td|jjD]#\}}td|d|jdd|$td|jjD]#\}}td|d|jdd|$td |jjD]#\}}td|d|jdd|$d S#tj Yd SxYw) z4Debug routine - dumps what it knows about an object.zAxDispatch containerzMethods: zProps:z = 0xxz - z Get Props:z Put Props:N) r rPrQrpropMapitemsrer propMapPutrr)rXmethodpropr0s r_print_details_zCDispatch._print_details_s $do666 " *   .1 $ $dF#### (OOO#~5;;== D D eB4BBelBBBBBCCCC ,   #~8>>@@ D D eB4BBelBBBBBCCCC ,   #~8>>@@ D D eB4BBelBBBBBCCCC D D "   ! ! ! ! ! !s D!D::Ec ||rt|jd|ddSdS#t$rYdSwxYw)Nz .__LazyMap__(z) added somethingrr) _LazyAddAttr_rrPr~rXrJs r __LazyMap__zCDispatch.__LazyMap__sz !!$''  LLTLLLq       11 s/5 AAcb|jdSd}|j\}}|j}tD] } |||\}}|dkr-|dddvr!||dd|\}}|tjkr|||d} n*|tjkr|||d} nd} | ]| d| d} } | | } | |j kr| | | n!| |j kr| | | d}#YxYw|S)Nr)SetGetr) rVrQALL_INVOKE_TYPESBindrDESCKIND_FUNCDESC _AddFunc_r._AddVar_r_propMapPutCheck_r_propMapGetCheck_) rXrJresr;r<r=irtrkeyrrs rr zCDispatch._LazyAddAttr_sf ? "1!_(. "  A }}T1--166d2A2h.88#==abb155DAq 333))(Aq99AA)444((1a88AAAy tQqTCs8Dg00011#t<<<< 22211#t<<<C  s C=D''D,c|D]:}tj|||f}||jj|<;dS)a Flag these attribute names as being methods. Some objects do not correctly differentiate methods and properties, leading to problems when calling these methods. Specifically, trying to say: ob.SomeFunc() may yield an exception "None object is not callable" In this case, an attempt to fetch the *property* has worked and returned None, rather than indicating it is really a method. Calling: ob._FlagAsMethod("SomeFunc") should then allow this to work. N)rMapEntry __AttrToID__rQr)rX methodNamesrrrs r _FlagAsMethodzCDispatch._FlagAsMethodsP  4 4DnT%6%6t%<%Calling GetIDsOfNames for property {} in Dispatch container {}r)rformatrPrrr s rrzCDispatch.__AttrToID__sH L S Sdo     }**1d333rc|dkr tjtjz}|jtjt |dd}n"#tj$rtdwxYwGdd}||S| dr$| drt| t|j ||S#t$rYnwxYw||jjvr||Sd}|jr|jr|jj|}||jj|}| ||rc||jjvr||S|jj|}||jj|}|)t+j|||f}n#tj$rYnwxYw|N |j|j}t7d||S#ttf$rt7d |zYnwxYw|t9|tj}t7d |jz |j|jd |d }nO#tj$r=}|jt@vr)||jj|<||cYd}~Sd}~wwxYwt7d ||!|St|j"d|)N__iter__rriz+This object can not function as an iteratorceZdZdZdZdS)&CDispatch.__getattr__..Factoryc||_dSr')r)rXrs rrYz/CDispatch.__getattr__..Factory.__init__.s  DGGGrcRddl}|jj|jSr)win32com.client.utilrrIteratorr)rXrs rrgz/CDispatch.__getattr__..Factory.__call__1s)////#?/88AAArN)__name__ __module__ __qualname__rYrgrirrFactoryr'-s7!!!BBBBBrr/_zCached items has attribute!zAttribute %s not in cachez(Getting property Id 0x%x from OLE objectrrz OLE returned .)#rr^r_rrrrar8r~ startswithendswithrrSrrQrrrgetrr rrrrrRrerr2INVOKE_PROPERTYGETrcrprqrbrP) rXrJr/rr/retEntryretr1rrs r __getattr__zCDispatch.__getattr__ s :   T#3i6TT}00,dGXr& T T T$%RSSS T B B B B B B B B74== ??3   'DMM#$6$6 ' && & d1$7>> >    D  4>* * *%%d++ + > dm ~-11$77H>488>> ''--K4>#:::#'#5#5d#;#;;#'>#9#=#=d#C#C#+'+~'@'D'DT'J'JH'#(>$2C2CD2I2ID7#S#S *D   E+HO< !>DDD n- E E E ! t~---.t40 8TUU  $$U\1k1eLLLt~0001$70 8TUU  $$U\1k1eLLL =% %% 4>111 N248E"4y;##KM((q+q%PPPF4>444 N5d;E"4y;##KM((q+q%PPPF t'8'8'>'>HH&      "4y;##KM((q+q%PPP38DN*40$V]] %, F *DS$/SSDSSSTTTs%)G??HHA:JJ'&J'r)!r,r-r.rYrgrkrnrsrr|rrrrrrrrr]rrrrbrrrrr r r!rr8r=rirrr5r5s / / / /QQQ$ 444###%%%   2222&&&&&&$$$OOO ) ) )DDD QQQ& R R RAAA &&&&    5555&8    ' ' '"""&!!!F444 444W:W:W:rBUBUBUBUBUrr5)-__doc__r itertoolsrtypesrrwin32com.clientrwinerror pywintypesrrrr rraDISP_E_MEMBERNOTFOUNDDISP_E_BADPARAMCOUNTDISP_E_PARAMNOTOPTIONALDISP_E_TYPEMISMATCH E_INVALIDARGrqr5r;INVOKE_PROPERTYPUTREF INVOKE_FUNCrrrTypeIIDsr!r IID_IUnknownrr(r CLSCTX_SERVERr%r*r2r>r9rMr5rirrrNs$    " ! $        #  $Y%<=#I$:;7^(1'>" ; ; ;   $   " HHHH6:  " B B B B@U@U@U@U@U@U@U@U@U@Ur