"""
Demo a DynamicPolicy használatára
Attrs példányainak nincs metódusa, de tetszőleges számú tulajdonsága lehet, melyek
futásidőben egyszerű értékadással keletkeznek. Természetesen hiba generálódik, ha
olyan tulajdonságra hivatkozunk akinek még nem lett érték adva. Futás közben egy már
létező tulajdonság tipusa megváltoztatható, egyszerűen egy más tipusú értéket
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álatára
"""
# szokásos regisztráció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ációhoz és működéshez használatos elmeket,
# akiket nem akarunk elérhető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álok, hogy ne legyen kavar
if name in self._tiltott_nevek_:
raise COMException("%s használata tiltott!" % name,winerror.DISP_E_EXCEPTION)
if wFlags & pythoncom.DISPATCH_METHOD:
raise COMException("A metódushívás tiltott!",winerror.DISP_E_EXCEPTION)
elif wFlags & pythoncom.DISPATCH_PROPERTYGET:
# figyelni kell, mert lehet még nincs ilyen tulajdonság
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ámára a metódus is csak egy attributum, ezért először
# DISPATCH_PROPERTYGET-el próbálkozik és ha DISP_E_MEMBERNOTFOUND-ot kap vissza, akkor
# metódusnak hiszi
raise COMException("Nincs %s nevű tulajdonság!" % 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ásos regisztrálás, de a policy nem az alapértelmezett DesignatedWrapPolicy lesz,
# hanem a H2O class _reg_policy_spec_ attributumában beállított DynamicPolicy
from win32com.server.register import UseCommandLine
return UseCommandLine(Attrs)
if __name__=='__main__':
Register()