Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# such an object.
#
# engine = CreateObject("MsScriptControl.ScriptControl")
# engine.Language = "JScript"
# engine.Eval("[1, 2, 3]")
#
# Could the above code, as an optimization, check that QI works,
# *before* generating the wrapper module?
result = punk.QueryInterface(interface)
logger.debug("Final result is %s", result)
return result
# backwards compatibility:
wrap = GetBestInterface
# Should we do this for POINTER(IUnknown) also?
ctypes.POINTER(comtypes.automation.IDispatch).__ctypes_from_outparam__ = wrap_outparam
################################################################
#
# Typelib constants
#
class Constants(object):
"""This class loads the type library from the supplied object,
then exposes constants in the type library as attributes."""
def __init__(self, obj):
obj = obj.QueryInterface(comtypes.automation.IDispatch)
tlib, index = obj.GetTypeInfo(0).GetContainingTypeLib()
self.tcomp = tlib.GetTypeComp()
def __getattr__(self, name):
try:
kind, desc = self.tcomp.Bind(name)
def addEventListener(self, node, event_name, event_fn):
rcvr = mshtmlevents._DispEventReceiver()
rcvr.dispmap = {0: event_fn}
rcvr.sender = node
ifc = rcvr.QueryInterface(IDispatch)
v = VARIANT(ifc)
setattr(node, "on"+event_name, v)
return ifc
rcvr = mshtmlevents.GetDispEventReceiver(MSHTML.HTMLElementEvents2, event_fn, "on%s" % event_name)
rcvr.sender = node
ifc = rcvr.QueryInterface(IDispatch)
node.attachEvent("on%s" % event_name, ifc)
return ifc
def CreateEventReceiver(interface, handler):
class Sink(comtypes.COMObject):
_com_interfaces_ = [interface]
def _get_method_finder_(self, itf):
# Use a special MethodFinder that will first try 'self',
# then the sink.
return _SinkMethodFinder(self, handler)
sink = Sink()
# Since our Sink object doesn't have typeinfo, it needs a
# _dispimpl_ dictionary to dispatch events received via Invoke.
if issubclass(interface, comtypes.automation.IDispatch) \
and not hasattr(sink, "_dispimpl_"):
finder = sink._get_method_finder_(interface)
dispimpl = sink._dispimpl_ = {}
for m in interface._methods_:
restype, mthname, argtypes, paramflags, idlflags, helptext = m
# Can dispid be at a different index? Should check code generator...
# ...but hand-written code should also work...
dispid = idlflags[0]
impl = finder.get_impl(interface, mthname, paramflags, idlflags)
# XXX Wouldn't work for 'propget', 'propput', 'propputref'
# methods - are they allowed on event interfaces?
dispimpl[(dispid, comtypes.automation.DISPATCH_METHOD)] = impl
return sink
def __init__(self,NVDAObject):
#Create a html document com pointer and point it to the com object we receive from the internet explorer_server window
#domPointer=ctypes.POINTER(comInterfaces.MSHTML.DispHTMLDocument)()
domPointer=ctypes.POINTER(comtypes.automation.IDispatch)()
wm=winUser.registerWindowMessage(u'WM_HTML_GETOBJECT')
lresult=winUser.sendMessage(NVDAObject.windowHandle,wm,0,0)
ctypes.windll.oleacc.ObjectFromLresult(lresult,ctypes.byref(domPointer._iid_),0,ctypes.byref(domPointer))
self.dom=comtypes.client.wrap(domPointer)
virtualBuffer.__init__(self,NVDAObject)
#Set up events for the document, plus any sub frames
self.domEventsObject=self.domEventsType(self)
self._comEvents=comtypes.client.GetEvents(self.dom,self.domEventsObject,interface=comInterfaces.MSHTML.HTMLDocumentEvents2)
if self.isDocumentComplete():
self.loadDocument()
def _get_WinwordDocumentObject(self):
if not hasattr(self,'_WinwordDocumentObject'):
ptr=ctypes.POINTER(comtypes.automation.IDispatch)()
if ctypes.windll.oleacc.AccessibleObjectFromWindow(self.windowHandle,IAccessibleHandler.OBJID_NATIVEOM,ctypes.byref(comtypes.automation.IDispatch._iid_),ctypes.byref(ptr))!=0:
raise OSError("No native object model")
self._WinwordDocumentObject=comtypes.client.dynamic.Dispatch(ptr)
return self._WinwordDocumentObject
def _get_dispmap(interface):
# return a dictionary mapping dispid numbers to method names
assert issubclass(interface, comtypes.automation.IDispatch)
dispmap = {}
if "dual" in interface._idlflags_:
# It would be nice if that would work:
## for info in interface._methods_:
## mth = getattr(interface, info.name)
## memid = mth.im_func.memid
# See also MSDN docs for the 'defaultvtable' idl flag, or
# IMPLTYPEFLAG_DEFAULTVTABLE. This is not a flag of the
# interface, but of the coclass!
#
# Use the _methods_ list
assert not hasattr(interface, "_disp_methods_")
for restype, name, argtypes, paramflags, idlflags, helpstring in interface._methods_:
memid = _getmemid(idlflags)
obj = _midlSAFEARRAY(VARIANT).create(value)
else:
obj = _midlSAFEARRAY(typ).create(value)
memmove(byref(self._), byref(obj), sizeof(obj))
self.vt = VT_ARRAY | obj._vartype_
elif isinstance(value, Structure) and hasattr(value, "_recordinfo_"):
guids = value._recordinfo_
from comtypes.typeinfo import GetRecordInfoFromGuids
ri = GetRecordInfoFromGuids(*guids)
self.vt = VT_RECORD
# Assigning a COM pointer to a structure field does NOT
# call AddRef(), have to call it manually:
ri.AddRef()
self._.pRecInfo = ri
self._.pvRecord = ri.RecordCreateCopy(byref(value))
elif isinstance(getattr(value, "_comobj", None), POINTER(IDispatch)):
CopyComPointer(value._comobj, byref(self._))
self.vt = VT_DISPATCH
elif isinstance(value, VARIANT):
_VariantCopy(self, value)
elif isinstance(value, c_ubyte):
self._.VT_UI1 = value
self.vt = VT_UI1
elif isinstance(value, c_char):
self._.VT_UI1 = ord(value.value)
self.vt = VT_UI1
elif isinstance(value, c_byte):
self._.VT_I1 = value
self.vt = VT_I1
elif isinstance(value, c_ushort):
self._.VT_UI2 = value
self.vt = VT_UI2
def accessible_object_from_window(hwnd):
ptr = POINTER(IDispatch)()
res = oledll.oleacc.AccessibleObjectFromWindow(
hwnd, OBJID_NATIVEOM,
byref(IDispatch._iid_), byref(ptr))
return ptr