dokumentum verzi?k:
Az el?z? cikkemet a kezd? l駱駸ek megt騁el馼ez sz疣tam seg馘anyagnak. Most igyekszem a t駑畸an egy kicsit m駘yebbre 疽ni 駸 a Python-COM p疵os kapcsolat疣ak meg駻t駸馼ez adok ?jabb inform當i?kat:
T?m?ren megfogalmazva a m?g?ttes infrastrukt?ra a python objektumb?l egy IDispatch objektumot csin疝.
Miel?tt v痙latos l駱駸ekben ismertetn駑, hogy a framework hogyan 疝l?tja el? ezt az IDispatch objektumot, meg kell ismerkedn?nk a policy-kkal. A policy gyakorlatilag egy k?zvet?t? a python objektum 駸 a COM objektum k?z?tt, meghat疵ozza hogy milyen met?dusok 駸 attributumok 駻het?ek el COM-on kereszt?l, milyen dispatch ID-kat rendel ezekhez stb. Az el?z? cikkben ismertett p駘d疚ban az駻t nem tal疝koztunk policy-kkal, mert van egy alap駻telmezett, a DesignatedWrapPolicy. A DesignatedWrapPolicy-nek kellenek az el?z? cikk forr疽aiban szerepl? _public_methods_, _public_attrs_ stb. attributumok. Az el?regy疵tott policy-k k?z?l ebben a cikkben a DynamicPolicy-vel ker?l?nk k?zelebbi ismerets馮be. A policy-k python-ban k駸z?ltek, azaz mi is ?rhatunk egyet amennyiben a megl騅?k egyike sem megfelel? sz疥unkra.
N騷z?k mit csin疝 a framework pl. egy VB-b?l kiadott CreateObject hat疽疵a:
Van m馮egy be駝el?d? python objektum a dispatcher, az el?z? folyamat-le?r疽b?l az駻t maradt ki mert fogalmam sincs hogy hov? 駝el?dik be pontosan. Els?sorban debugg-ol疽ra haszn疝juk. Az alap駻telmezett DispatcherWin32trace - mint nev饕?l is l疸szik - a win32trace modult haszn疝ja, azaz Pythonwin-ben a a Tools men?b?l elind?tva a "Trace Collector Debugging tool"-t, a megjelen? ablakban nyomon k?vethetj?k, hogy milyen h?v疽okat kapott objektumunk ill. a nyomk?vet駸i c駘lal kiadott print utas?t疽aink eredm駭ye is itt jelenik meg. Ha nyomk?vet駸re van sz?ks馮?nk, akkor azt COM komponens?nk regisztr當i?jakor kell megadni ill. ha nem megfelel? az alap駻telmezett DispatcherWin32trace, akkor a "_reg_debug_dispatcher_spec_"-et be疝l?tva k駻het?nk m疽 dispatcher-t. Az el?z? cikk p駘d疂ban is haszn疝t UseCommandLine a szkript?nk futtat疽akor megadott parancssori param騁erek alapj疣 d?nti el, hogy mi a teend?je:
Mi駻t fontos az el?z? folyamat ismerete? Mindaddig am?g egy regisztr疝t class-unk van 駸 annak met?dusai nem akarnak COM objektumot visszadni, igaz畸?l nem t?l 駻dekes az eg駸z. Baj akkor van, ha van egy python objektumunk, amit szeretn駭k ?gy visszadni a kliensnek, hogy az egy kezelhet? IDispatch interf駸zes COM objektumot l疽son. Erre val? a win32com.server.util.wrap, aki megcsin疝ja a fenti becsomagol? elj疵疽t. FIGYELEM: minden olyan python class-nak, amit csomagolni szeretn駭k rendelkeznie kell azokkal az attributumokkal, amit a haszn疝t policy(wrap f?ggv駭y usePolicy argumentuma) megk?v疣, de nem kellenek a regisztr當i?s param騁erek ha nem akarjuk regisztr疝ni(pl. csak egy m疽ik objektum met?dus h?v疽ain kereszt?l 駻het? el). A win32com.server.util.wrap f?ggv駭y p疵ja a win32com.server.util.unwrap, amivel a klienst?l visszakapott COM objektumokb?l kicsomagolhatjuk a python objektumot. Ha olyan COM objektumot pr?b疝unk meg kicsomagolni, aki nem tartalmaz python objektumot(mert nem Python-ban ?rt疚) akkor hiba?zenetet kapunk.
A DynamicPolicy a DesignatedWrapPolicy-vel ellent騁tem - mint nev饕?l is sejthet? - dinamikusan fut疽k?zben hat疵ozza meg, hogy milyen met?dusok 駸 attributumok l疸hat?ak a COM-on kereszt?l, azaz nincs a class-unknak _public_methods_, _public_attrs_ stb. attributuma. Ez a dinamikuss疊 annyira igaz, hogy fut疽 k?zben gy疵thatunk 駸 megsz?ntethet?nk met?dusokat, tulajdons疊okat. A DynamicPolicy van annyira rendes hozz疣k, hogy elint騷i az IDispatch interface Invoke 駸 GetIDsOfNames h?v疽ainak kezel駸騁, nek?nk m疵 csak nevekkel kell foglalkozni. Class-unknak a szok疽os regisztr當i?s attributumain k?v?l csak egyetlen k?telez? met?dusra van a _dynamic_, amiben le kell kezelni a met?dusok h?v疽疸, az attributumok lek駻dez駸騁 ill. 駻t駝ad疽疸 vagy adott esetben "le kell tagadnunk azok l騁騁".
Python kliens eset饕en met?dusra hivatkoz疽 is el?sz?r tulajdons疊 lek駻dez駸k駭t jelenik meg (_dynamic_ met?dus wFlags argumentuma) 駸 ilyenkor pythoncom.DISP_E_MEMBERNOTFOUND exception-t gener疝va lehet r疱enni, hogy met?dusk駭t is pr?b疝ja meg. Ez az駻t van, mert a Python vil疊ban a met?dus is attributum. VB kliens eset駭 pedig met?dus h?v疽kor a _dynamic_ met?dus wFlags argumentuma pythoncom.DISPATCH_PROPERTYGET | pythoncom.DISPATCH_METHOD is lehet, mert a VB bizonyos helyzetekben k駱telen eld?nteni melyikr?l van sz?. A pythoncom.DISPATCH_METHOD vizsg疝atot el?re v騅e 駸 kieg駸z?tve annak viszg疝at疱al, hogy az attributum val?ban met?dus-e a k駻d駸 megnyugtat?an kezelhet?.
A lenti p駘d疚ban igyekeztem mindent kisbet?sen haszn疝ni a python forr疽okban ill. a kapott param騁ereket kisbet?sre konvert疝tam, mert pl. a VB-nek mindegy hogy kisbet? vagy nagybet?, de a Python megk?l?nb?zteti.
Az els? p駘da nagyon egyszer?: COM objektumunknak nincs egyetlen met?dusa sem, viszont fut疽id?ben korl疸lan sz疥? ?j tulajdons疊ot hozhatunk l騁re 駸 azok 駻t駝騁 lek駻dezhetj?k, m?dos?thatjuk, s?t tipusukat is megv疝toztathatjuk.
A p駘da forr疽a 駸 egy teszt kliens.
M疽odik p駘d疣k egy buta v?z objektum lesz, a H2O. Egy H2O instance allapot tulajdons疊a "szil疵d" vagy "foly駝ony" lehet(l騁rehoz疽 ut疣 "foly駝ony"). Az allapot tulajdons疊 mindig lek駻dezhet?, de nem lehet direktben m?dos?tani. A masolj met?dus is mindig megh?vhat? 駸 a visszadott 駻t駝 egy ?j H2O instance lesz az aktu疝is 疝lapottal. A fagyjmeg 駸 az olvadjmeg met?dusok csak a megfelel? allapot 駻t駝 eset駭 l騁eznek, azaz pl. "szil疵d" allapot eset饕en fagyjmeg h?v疽a "Member not found." hiba?zenetet gener疝.
A p駘da forr疽a 駸 egy egyszer? kliens a tesztel駸hez.
A DynamicPolicy haszn疝at疵a egy kicsit bonyolultabb, de realisztikusabb p駘da a COMToCorba scriptem, mellyel COM-b?l lehet Corba objektumokat el駻ni. Ebben a programban a unicode kezel駸駻e is l疸hattok p駘d疸. Egyr駸zt a COM bel?l unicode-os, ez駻t ami bemegy az unicode-ra konvert疝?dik 駸 ?gy is j?n ki bel?le. M疽r駸zt a Python 1.52-es verzi?j畸an viszont m馮 nem volt unicode kezel駸, ez駻t figyelni kellett p駘d疼l a COM-b?l j?v? stringekre ha azokat Python-ban is haszn疝ni akartuk(egy str() h?v疽 megtette). A Python 2.0-疽 verz?ja m疵 kezeli a unicode-ot, ?gy ez a gond megsz?nt. Az omniORBpy viszont m馮 nem kezel unicode-ot, teh疸 miatta(駸 minden nem unicode-os api haszn疝ata miatt is) m馮 mindig konvert疝gatni kell.
Ebbe a cikkbe ennyi f駻t bele. Az online el駻het? dokument當i?kon 駸 programforr疽okon k?v?l aj疣lom figyelmetekbe Mark Hammond 駸 Andy Robinson k?nyv騁: Python Programming on win32(n馼疣y dolgot 駭 is ebb?l szipk痙tam:-)). Term駸zetesen a lenti c?memen is pr?b疝kozhatsz ha v馮k駱p elakadt疝.