dynamit.py
"""
Demo a DynamicPolicy haszn疝at疵a
Attrs p駘d疣yainak nincs met?dusa, de tetsz?leges sz疥? tulajdons疊a lehet, melyek
fut疽id?ben egyszer? 駻t駝ad疽sal keletkeznek. Term駸zetesen hiba gener疝?dik, ha
olyan tulajdons疊ra hivatkozunk akinek m馮 nem lett 駻t駝 adva. Fut疽 k?zben egy m疵
l騁ez? tulajdons疊 tipusa megv疝toztathat?, egyszer?en egy m疽 tipus? 駻t駝et
pakolunk bele(ez nem ?gy hiszen a Python ?gy m?k?dik).
"""
import pythoncom
import winerror
from win32com.server.exception import COMException
import string
class Attrs:
"""
Demo a DynamicPolicy haszn疝at疵a
"""
# szok疽os regisztr當i?s adatok
_reg_desc_ = 'Attrs demo class'
_reg_clsid_ = '{CFFDFAAB-AD71-48B1-A478-695B44617AA0}'
_reg_progid_ = 'Demo.Attrs'
_reg_verprogid_ = 'Demo.Attrs.1'
_reg_policy_spec_ = 'DynamicPolicy'
# kigy?jt?ttem ide azokat a regisztr當i?hoz 駸 m?k?d駸hez haszn疝atos elmeket,
# akiket nem akarunk el駻het?v? tenni a COM-os fel?leten kereszt?l
_tiltott_nevek_ = ['_reg_desc_',
'_reg_clsid_',
'_reg_progid_',
'_reg_verprogid_',
'_reg_policy_spec_',
'_tiltott_nevek_',
'_dynamic_']
def _dynamic_(self, name, lcid, wFlags, args):
name=string.lower(name) # mindent kisbet?re konvert疝ok, hogy ne legyen kavar
if name in self._tiltott_nevek_:
raise COMException("%s haszn疝ata tiltott!" % name,winerror.DISP_E_EXCEPTION)
if wFlags & pythoncom.DISPATCH_METHOD:
raise COMException("A met?dush?v疽 tiltott!",winerror.DISP_E_EXCEPTION)
elif wFlags & pythoncom.DISPATCH_PROPERTYGET:
# figyelni kell, mert lehet m馮 nincs ilyen tulajdons疊
try:
return getattr(self,name)
except AttributeError:
# DISP_E_MEMBERNOTFOUND nem j?, mert a Python kliens erre azt hiszi, hogy met?dusr?l
# van sz?. A Python sz疥疵a a met?dus is csak egy attributum, ez駻t el?sz?r
# DISPATCH_PROPERTYGET-el pr?b疝kozik 駸 ha DISP_E_MEMBERNOTFOUND-ot kap vissza, akkor
# met?dusnak hiszi
raise COMException("Nincs %s nev? tulajdons疊!" % name,winerror.DISP_E_UNKNOWNNAME)
elif wFlags & (pythoncom.DISPATCH_PROPERTYPUT | pythoncom.DISPATCH_PROPERTYPUTREF):
# itt nem lehet hiba
setattr(self,name,args[0])
return
else:
raise COMException("invalid wFlags", winerror.E_INVALIDARG)
def Register():
# szok疽os regisztr疝疽, de a policy nem az alap駻telmezett DesignatedWrapPolicy lesz,
# hanem a H2O class _reg_policy_spec_ attributum畸an be疝l?tott DynamicPolicy
from win32com.server.register import UseCommandLine
return UseCommandLine(Attrs)
if __name__=='__main__':
Register()