You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
914 lines
31 KiB
914 lines
31 KiB
# XXX Should convert from STDMETHOD to COMMETHOD.
|
|
|
|
# generated by 'xml2py'
|
|
# flags '..\tools\windows.xml -m comtypes -m comtypes.automation -w -r .*TypeLibEx -r .*TypeLib -o typeinfo.py'
|
|
# then hacked manually
|
|
import os
|
|
import sys
|
|
import weakref
|
|
|
|
from ctypes import *
|
|
from ctypes.wintypes import ULONG
|
|
from comtypes import STDMETHOD
|
|
from comtypes import COMMETHOD
|
|
from comtypes import _GUID, GUID
|
|
# XXX should import more stuff from ctypes.wintypes...
|
|
from comtypes.automation import BSTR
|
|
from comtypes.automation import DISPID
|
|
from comtypes.automation import DISPPARAMS
|
|
from comtypes.automation import DWORD
|
|
from comtypes.automation import EXCEPINFO
|
|
from comtypes.automation import HRESULT
|
|
from comtypes.automation import IID
|
|
from comtypes.automation import IUnknown
|
|
from comtypes.automation import LCID
|
|
from comtypes.automation import LONG
|
|
from comtypes.automation import SCODE
|
|
from comtypes.automation import UINT
|
|
from comtypes.automation import VARIANT
|
|
from comtypes.automation import VARIANTARG
|
|
from comtypes.automation import VARTYPE
|
|
from comtypes.automation import WCHAR
|
|
from comtypes.automation import WORD
|
|
from comtypes.automation import tagVARIANT
|
|
|
|
is_64_bit = sys.maxsize > 2**32
|
|
|
|
BOOL = c_int
|
|
HREFTYPE = DWORD
|
|
INT = c_int
|
|
MEMBERID = DISPID
|
|
OLECHAR = WCHAR
|
|
PVOID = c_void_p
|
|
SHORT = c_short
|
|
# See https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#ULONG_PTR # noqa
|
|
ULONG_PTR = c_uint64 if is_64_bit else c_ulong
|
|
|
|
USHORT = c_ushort
|
|
LPOLESTR = POINTER(OLECHAR)
|
|
|
|
################################################################
|
|
# enums
|
|
tagSYSKIND = c_int # enum
|
|
SYS_WIN16 = 0
|
|
SYS_WIN32 = 1
|
|
SYS_MAC = 2
|
|
SYS_WIN64 = 3
|
|
SYSKIND = tagSYSKIND
|
|
|
|
tagREGKIND = c_int # enum
|
|
REGKIND_DEFAULT = 0
|
|
REGKIND_REGISTER = 1
|
|
REGKIND_NONE = 2
|
|
REGKIND = tagREGKIND
|
|
|
|
tagTYPEKIND = c_int # enum
|
|
TKIND_ENUM = 0
|
|
TKIND_RECORD = 1
|
|
TKIND_MODULE = 2
|
|
TKIND_INTERFACE = 3
|
|
TKIND_DISPATCH = 4
|
|
TKIND_COCLASS = 5
|
|
TKIND_ALIAS = 6
|
|
TKIND_UNION = 7
|
|
TKIND_MAX = 8
|
|
TYPEKIND = tagTYPEKIND
|
|
|
|
tagINVOKEKIND = c_int # enum
|
|
INVOKE_FUNC = 1
|
|
INVOKE_PROPERTYGET = 2
|
|
INVOKE_PROPERTYPUT = 4
|
|
INVOKE_PROPERTYPUTREF = 8
|
|
INVOKEKIND = tagINVOKEKIND
|
|
|
|
tagDESCKIND = c_int # enum
|
|
DESCKIND_NONE = 0
|
|
DESCKIND_FUNCDESC = 1
|
|
DESCKIND_VARDESC = 2
|
|
DESCKIND_TYPECOMP = 3
|
|
DESCKIND_IMPLICITAPPOBJ = 4
|
|
DESCKIND_MAX = 5
|
|
DESCKIND = tagDESCKIND
|
|
|
|
tagVARKIND = c_int # enum
|
|
VAR_PERINSTANCE = 0
|
|
VAR_STATIC = 1
|
|
VAR_CONST = 2
|
|
VAR_DISPATCH = 3
|
|
VARKIND = tagVARKIND
|
|
|
|
tagFUNCKIND = c_int # enum
|
|
FUNC_VIRTUAL = 0
|
|
FUNC_PUREVIRTUAL = 1
|
|
FUNC_NONVIRTUAL = 2
|
|
FUNC_STATIC = 3
|
|
FUNC_DISPATCH = 4
|
|
FUNCKIND = tagFUNCKIND
|
|
|
|
tagCALLCONV = c_int # enum
|
|
CC_FASTCALL = 0
|
|
CC_CDECL = 1
|
|
CC_MSCPASCAL = 2
|
|
CC_PASCAL = 2
|
|
CC_MACPASCAL = 3
|
|
CC_STDCALL = 4
|
|
CC_FPFASTCALL = 5
|
|
CC_SYSCALL = 6
|
|
CC_MPWCDECL = 7
|
|
CC_MPWPASCAL = 8
|
|
CC_MAX = 9
|
|
CALLCONV = tagCALLCONV
|
|
|
|
IMPLTYPEFLAG_FDEFAULT = 1
|
|
IMPLTYPEFLAG_FSOURCE = 2
|
|
IMPLTYPEFLAG_FRESTRICTED = 4
|
|
IMPLTYPEFLAG_FDEFAULTVTABLE = 8
|
|
|
|
tagTYPEFLAGS = c_int # enum
|
|
TYPEFLAG_FAPPOBJECT = 1
|
|
TYPEFLAG_FCANCREATE = 2
|
|
TYPEFLAG_FLICENSED = 4
|
|
TYPEFLAG_FPREDECLID = 8
|
|
TYPEFLAG_FHIDDEN = 16
|
|
TYPEFLAG_FCONTROL = 32
|
|
TYPEFLAG_FDUAL = 64
|
|
TYPEFLAG_FNONEXTENSIBLE = 128
|
|
TYPEFLAG_FOLEAUTOMATION = 256
|
|
TYPEFLAG_FRESTRICTED = 512
|
|
TYPEFLAG_FAGGREGATABLE = 1024
|
|
TYPEFLAG_FREPLACEABLE = 2048
|
|
TYPEFLAG_FDISPATCHABLE = 4096
|
|
TYPEFLAG_FREVERSEBIND = 8192
|
|
TYPEFLAG_FPROXY = 16384
|
|
TYPEFLAGS = tagTYPEFLAGS
|
|
|
|
tagFUNCFLAGS = c_int # enum
|
|
FUNCFLAG_FRESTRICTED = 1
|
|
FUNCFLAG_FSOURCE = 2
|
|
FUNCFLAG_FBINDABLE = 4
|
|
FUNCFLAG_FREQUESTEDIT = 8
|
|
FUNCFLAG_FDISPLAYBIND = 16
|
|
FUNCFLAG_FDEFAULTBIND = 32
|
|
FUNCFLAG_FHIDDEN = 64
|
|
FUNCFLAG_FUSESGETLASTERROR = 128
|
|
FUNCFLAG_FDEFAULTCOLLELEM = 256
|
|
FUNCFLAG_FUIDEFAULT = 512
|
|
FUNCFLAG_FNONBROWSABLE = 1024
|
|
FUNCFLAG_FREPLACEABLE = 2048
|
|
FUNCFLAG_FIMMEDIATEBIND = 4096
|
|
FUNCFLAGS = tagFUNCFLAGS
|
|
|
|
tagVARFLAGS = c_int # enum
|
|
VARFLAG_FREADONLY = 1
|
|
VARFLAG_FSOURCE = 2
|
|
VARFLAG_FBINDABLE = 4
|
|
VARFLAG_FREQUESTEDIT = 8
|
|
VARFLAG_FDISPLAYBIND = 16
|
|
VARFLAG_FDEFAULTBIND = 32
|
|
VARFLAG_FHIDDEN = 64
|
|
VARFLAG_FRESTRICTED = 128
|
|
VARFLAG_FDEFAULTCOLLELEM = 256
|
|
VARFLAG_FUIDEFAULT = 512
|
|
VARFLAG_FNONBROWSABLE = 1024
|
|
VARFLAG_FREPLACEABLE = 2048
|
|
VARFLAG_FIMMEDIATEBIND = 4096
|
|
VARFLAGS = tagVARFLAGS
|
|
|
|
PARAMFLAG_NONE = 0
|
|
PARAMFLAG_FIN = 1
|
|
PARAMFLAG_FOUT = 2
|
|
PARAMFLAG_FLCID = 4
|
|
PARAMFLAG_FRETVAL = 8
|
|
PARAMFLAG_FOPT = 16
|
|
PARAMFLAG_FHASDEFAULT = 32
|
|
PARAMFLAG_FHASCUSTDATA = 64
|
|
|
|
################################################################
|
|
# a helper
|
|
def _deref_with_release(ptr, release):
|
|
# Given a POINTER instance, return the pointed to value.
|
|
# Call the 'release' function with 'ptr' to release resources
|
|
# when the value is no longer needed.
|
|
result = ptr[0]
|
|
result.__ref__ = weakref.ref(result, lambda dead: release(ptr))
|
|
return result
|
|
|
|
# interfaces
|
|
|
|
class ITypeLib(IUnknown):
|
|
_iid_ = GUID("{00020402-0000-0000-C000-000000000046}")
|
|
|
|
# Commented out methods use the default implementation that comtypes
|
|
# automatically creates for COM methods.
|
|
|
|
## def GetTypeInfoCount(self):
|
|
## "Return the number of type informations"
|
|
|
|
## def GetTypeInfo(self, index):
|
|
## "Load type info by index"
|
|
|
|
## def GetTypeInfoType(self, index):
|
|
## "Return the TYPEKIND of type information"
|
|
|
|
## def GetTypeInfoOfGuid(self, guid):
|
|
## "Return type information for a guid"
|
|
|
|
def GetLibAttr(self):
|
|
"Return type library attributes"
|
|
return _deref_with_release(self._GetLibAttr(), self.ReleaseTLibAttr)
|
|
|
|
## def GetTypeComp(self):
|
|
## "Return an ITypeComp pointer."
|
|
|
|
## def GetDocumentation(self, index):
|
|
## "Return documentation for a type description."
|
|
|
|
def IsName(self, name, lHashVal=0):
|
|
"""Check if there is type information for this name.
|
|
|
|
Returns the name with capitalization found in the type
|
|
library, or None.
|
|
"""
|
|
from ctypes import create_unicode_buffer
|
|
namebuf = create_unicode_buffer(name)
|
|
found = BOOL()
|
|
self.__com_IsName(namebuf, lHashVal, byref(found))
|
|
if found.value:
|
|
return namebuf[:].split("\0", 1)[0]
|
|
return None
|
|
|
|
def FindName(self, name, lHashVal=0):
|
|
# Hm...
|
|
# Could search for more than one name - should we support this?
|
|
found = c_ushort(1)
|
|
tinfo = POINTER(ITypeInfo)()
|
|
memid = MEMBERID()
|
|
self.__com_FindName(name, lHashVal, byref(tinfo), byref(memid), byref(found))
|
|
if found.value:
|
|
return memid.value, tinfo
|
|
return None
|
|
|
|
## def ReleaseTLibAttr(self, ptla):
|
|
## "Release TLIBATTR"
|
|
|
|
################
|
|
|
|
def fix_name(name):
|
|
# Some typelibs contain BSTR with embedded NUL characters,
|
|
# probably the len of the BSTR is wrong.
|
|
if name is None:
|
|
return name
|
|
return name.split("\0")[0]
|
|
|
|
class ITypeInfo(IUnknown):
|
|
_iid_ = GUID("{00020401-0000-0000-C000-000000000046}")
|
|
|
|
def GetTypeAttr(self):
|
|
"Return the TYPEATTR for this type"
|
|
return _deref_with_release(self._GetTypeAttr(), self.ReleaseTypeAttr)
|
|
|
|
## def GetTypeComp(self):
|
|
## "Return ITypeComp pointer for this type"
|
|
|
|
def GetDocumentation(self, memid):
|
|
"""Return name, docstring, helpcontext, and helpfile for 'memid'."""
|
|
name, doc, helpcontext, helpfile = self._GetDocumentation(memid)
|
|
return fix_name(name), fix_name(doc), helpcontext, fix_name(helpfile)
|
|
|
|
def GetFuncDesc(self, index):
|
|
"Return FUNCDESC for index"
|
|
return _deref_with_release(self._GetFuncDesc(index), self.ReleaseFuncDesc)
|
|
|
|
def GetVarDesc(self, index):
|
|
"Return VARDESC for index"
|
|
return _deref_with_release(self._GetVarDesc(index), self.ReleaseVarDesc)
|
|
|
|
def GetNames(self, memid, count=1):
|
|
"Return names for memid"
|
|
names = (BSTR * count)()
|
|
cnames = c_uint()
|
|
self.__com_GetNames(memid, names, count, byref(cnames))
|
|
return names[:cnames.value]
|
|
|
|
## def GetRefTypeOfImplType(self, index):
|
|
## "Get the reftype of an implemented type"
|
|
|
|
## def GetImplTypeFlags(self, index):
|
|
## "Get IMPLTYPEFLAGS"
|
|
|
|
def GetIDsOfNames(self, *names):
|
|
"Maps function and argument names to identifiers"
|
|
rgsznames = (c_wchar_p * len(names))(*names)
|
|
ids = (MEMBERID * len(names))()
|
|
self.__com_GetIDsOfNames(rgsznames, len(names), ids)
|
|
return ids[:]
|
|
|
|
|
|
# not yet wrapped
|
|
## STDMETHOD(HRESULT, 'Invoke', [PVOID, MEMBERID, WORD, POINTER(DISPPARAMS), POINTER(VARIANT), POINTER(EXCEPINFO), POINTER(UINT)]),
|
|
|
|
## def GetDllEntry(self, memid, invkind):
|
|
## "Return the dll name, function name, and ordinal for a function and invkind."
|
|
|
|
## def GetRefTypeInfo(self, href):
|
|
## "Get type info for reftype"
|
|
|
|
def AddressOfMember(self, memid, invkind):
|
|
"Get the address of a function in a dll"
|
|
raise "Check Me"
|
|
p = c_void_p()
|
|
self.__com_AddressOfMember(memid, invkind, byref(p))
|
|
# XXX Would the default impl return the value of p?
|
|
return p.value
|
|
|
|
def CreateInstance(self, punkouter=None, interface=IUnknown, iid=None):
|
|
if iid is None:
|
|
iid = interface._iid_
|
|
return self._CreateInstance(punkouter, byref(interface._iid_))
|
|
|
|
## def GetMops(self, index):
|
|
## "Get marshalling opcodes (whatever that is...)"
|
|
|
|
## def GetContainingTypeLib(self):
|
|
## "Return index into and the containing type lib itself"
|
|
|
|
## def ReleaseTypeAttr(self, pta):
|
|
|
|
## def ReleaseFuncDesc(self, pfd):
|
|
|
|
## def ReleaseVarDesc(self, pvd):
|
|
|
|
################
|
|
|
|
class ITypeComp(IUnknown):
|
|
_iid_ = GUID("{00020403-0000-0000-C000-000000000046}")
|
|
|
|
def Bind(self, name, flags=0, lHashVal=0):
|
|
"Bind to a name"
|
|
bindptr = BINDPTR()
|
|
desckind = DESCKIND()
|
|
ti = POINTER(ITypeInfo)()
|
|
self.__com_Bind(name, lHashVal, flags, byref(ti), byref(desckind), byref(bindptr))
|
|
kind = desckind.value
|
|
if kind == DESCKIND_FUNCDESC:
|
|
fd = bindptr.lpfuncdesc[0]
|
|
fd.__ref__ = weakref.ref(fd, lambda dead: ti.ReleaseFuncDesc(bindptr.lpfuncdesc))
|
|
return "function", fd
|
|
elif kind == DESCKIND_VARDESC:
|
|
vd = bindptr.lpvardesc[0]
|
|
vd.__ref__ = weakref.ref(vd, lambda dead: ti.ReleaseVarDesc(bindptr.lpvardesc))
|
|
return "variable", vd
|
|
elif kind == DESCKIND_TYPECOMP:
|
|
return "type", bindptr.lptcomp
|
|
elif kind == DESCKIND_IMPLICITAPPOBJ:
|
|
raise NotImplementedError
|
|
elif kind == DESCKIND_NONE:
|
|
raise NameError("Name %s not found" % name)
|
|
|
|
def BindType(self, name, lHashVal=0):
|
|
"Bind a type, and return both the typeinfo and typecomp for it."
|
|
ti = POINTER(ITypeInfo)()
|
|
tc = POINTER(ITypeComp)()
|
|
self.__com_BindType(name, lHashVal, byref(ti), byref(tc))
|
|
return ti, tc
|
|
|
|
|
|
################
|
|
|
|
class ICreateTypeLib(IUnknown):
|
|
_iid_ = GUID("{00020406-0000-0000-C000-000000000046}")
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 2149
|
|
|
|
class ICreateTypeLib2(ICreateTypeLib):
|
|
_iid_ = GUID("{0002040F-0000-0000-C000-000000000046}")
|
|
|
|
class ICreateTypeInfo(IUnknown):
|
|
_iid_ = GUID("{00020405-0000-0000-C000-000000000046}")
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 915
|
|
|
|
def SetFuncAndParamNames(self, index, *names):
|
|
rgszNames = (c_wchar_p * len(names))()
|
|
for i, n in enumerate(names):
|
|
rgszNames[i] = n
|
|
return self._SetFuncAndParamNames(index, rgszNames, len(names))
|
|
|
|
class IRecordInfo(IUnknown):
|
|
# C:/vc98/include/OAIDL.H 5974
|
|
_iid_ = GUID("{0000002F-0000-0000-C000-000000000046}")
|
|
|
|
def GetFieldNames(self, *args):
|
|
count = c_ulong()
|
|
self.__com_GetFieldNames(count, None)
|
|
array = (BSTR * count.value)()
|
|
self.__com_GetFieldNames(count, array)
|
|
result = array[:]
|
|
# XXX Should SysFreeString the array contents. How to?
|
|
return result
|
|
|
|
IRecordInfo. _methods_ = [
|
|
COMMETHOD([], HRESULT, 'RecordInit',
|
|
(['in'], c_void_p, 'pvNew')),
|
|
COMMETHOD([], HRESULT, 'RecordClear',
|
|
(['in'], c_void_p, 'pvExisting')),
|
|
COMMETHOD([], HRESULT, 'RecordCopy',
|
|
(['in'], c_void_p, 'pvExisting'),
|
|
(['in'], c_void_p, 'pvNew')),
|
|
COMMETHOD([], HRESULT, 'GetGuid',
|
|
(['out'], POINTER(GUID), 'pguid')),
|
|
COMMETHOD([], HRESULT, 'GetName',
|
|
(['out'], POINTER(BSTR), 'pbstrName')),
|
|
COMMETHOD([], HRESULT, 'GetSize',
|
|
(['out'], POINTER(c_ulong), 'pcbSize')),
|
|
COMMETHOD([], HRESULT, 'GetTypeInfo',
|
|
(['out'], POINTER(POINTER(ITypeInfo)), 'ppTypeInfo')),
|
|
COMMETHOD([], HRESULT, 'GetField',
|
|
(['in'], c_void_p, 'pvData'),
|
|
(['in'], c_wchar_p, 'szFieldName'),
|
|
(['out'], POINTER(VARIANT), 'pvarField')),
|
|
COMMETHOD([], HRESULT, 'GetFieldNoCopy',
|
|
(['in'], c_void_p, 'pvData'),
|
|
(['in'], c_wchar_p, 'szFieldName'),
|
|
(['out'], POINTER(VARIANT), 'pvarField'),
|
|
(['out'], POINTER(c_void_p), 'ppvDataCArray')),
|
|
COMMETHOD([], HRESULT, 'PutField',
|
|
(['in'], c_ulong, 'wFlags'),
|
|
(['in'], c_void_p, 'pvData'),
|
|
(['in'], c_wchar_p, 'szFieldName'),
|
|
(['in'], POINTER(VARIANT), 'pvarField')),
|
|
COMMETHOD([], HRESULT, 'PutFieldNoCopy',
|
|
(['in'], c_ulong, 'wFlags'),
|
|
(['in'], c_void_p, 'pvData'),
|
|
(['in'], c_wchar_p, 'szFieldName'),
|
|
(['in'], POINTER(VARIANT), 'pvarField')),
|
|
COMMETHOD([], HRESULT, 'GetFieldNames',
|
|
(['in', 'out'], POINTER(c_ulong), 'pcNames'),
|
|
(['in'], POINTER(BSTR), 'rgBstrNames')),
|
|
COMMETHOD([], BOOL, 'IsMatchingType',
|
|
(['in'], POINTER(IRecordInfo))),
|
|
COMMETHOD([], HRESULT, 'RecordCreate'),
|
|
COMMETHOD([], HRESULT, 'RecordCreateCopy',
|
|
(['in'], c_void_p, 'pvSource'),
|
|
(['out'], POINTER(c_void_p), 'ppvDest')),
|
|
COMMETHOD([], HRESULT, 'RecordDestroy',
|
|
(['in'], c_void_p, 'pvRecord'))]
|
|
|
|
|
|
|
|
################################################################
|
|
# functions
|
|
_oleaut32 = oledll.oleaut32
|
|
|
|
def GetRecordInfoFromTypeInfo(tinfo):
|
|
"Return an IRecordInfo pointer to the UDT described in tinfo"
|
|
ri = POINTER(IRecordInfo)()
|
|
_oleaut32.GetRecordInfoFromTypeInfo(tinfo, byref(ri))
|
|
return ri
|
|
|
|
def GetRecordInfoFromGuids(rGuidTypeLib, verMajor, verMinor, lcid, rGuidTypeInfo):
|
|
ri = POINTER(IRecordInfo)()
|
|
_oleaut32.GetRecordInfoFromGuids(byref(GUID(rGuidTypeLib)),
|
|
verMajor, verMinor, lcid,
|
|
byref(GUID(rGuidTypeInfo)),
|
|
byref(ri))
|
|
return ri
|
|
|
|
def LoadRegTypeLib(guid, wMajorVerNum, wMinorVerNum, lcid=0):
|
|
"Load a registered type library"
|
|
tlib = POINTER(ITypeLib)()
|
|
_oleaut32.LoadRegTypeLib(byref(GUID(guid)), wMajorVerNum, wMinorVerNum, lcid, byref(tlib))
|
|
return tlib
|
|
|
|
if hasattr(_oleaut32, "LoadTypeLibEx"):
|
|
def LoadTypeLibEx(szFile, regkind=REGKIND_NONE):
|
|
"Load, and optionally register a type library file"
|
|
ptl = POINTER(ITypeLib)()
|
|
_oleaut32.LoadTypeLibEx(c_wchar_p(szFile), regkind, byref(ptl))
|
|
return ptl
|
|
else:
|
|
def LoadTypeLibEx(szFile, regkind=REGKIND_NONE):
|
|
"Load, and optionally register a type library file"
|
|
ptl = POINTER(ITypeLib)()
|
|
_oleaut32.LoadTypeLib(c_wchar_p(szFile), byref(ptl))
|
|
return ptl
|
|
|
|
def LoadTypeLib(szFile):
|
|
"Load and register a type library file"
|
|
tlib = POINTER(ITypeLib)()
|
|
_oleaut32.LoadTypeLib(c_wchar_p(szFile), byref(tlib))
|
|
return tlib
|
|
|
|
def UnRegisterTypeLib(libID, wVerMajor, wVerMinor, lcid=0, syskind=SYS_WIN32):
|
|
"Unregister a registered type library"
|
|
return _oleaut32.UnRegisterTypeLib(byref(GUID(libID)), wVerMajor, wVerMinor, lcid, syskind)
|
|
|
|
def RegisterTypeLib(tlib, fullpath, helpdir=None):
|
|
"Register a type library in the registry"
|
|
return _oleaut32.RegisterTypeLib(tlib, c_wchar_p(fullpath), c_wchar_p(helpdir))
|
|
|
|
def CreateTypeLib(filename, syskind=SYS_WIN32):
|
|
"Return a ICreateTypeLib2 pointer"
|
|
ctlib = POINTER(ICreateTypeLib2)()
|
|
_oleaut32.CreateTypeLib2(syskind, c_wchar_p(filename), byref(ctlib))
|
|
return ctlib
|
|
|
|
if os.name == "ce":
|
|
# See also:
|
|
# http://blogs.msdn.com/larryosterman/archive/2006/01/09/510856.aspx
|
|
#
|
|
# windows CE does not have QueryPathOfRegTypeLib. Emulate by reading the registry:
|
|
def QueryPathOfRegTypeLib(libid, wVerMajor, wVerMinor, lcid=0):
|
|
"Return the path of a registered type library"
|
|
import winreg
|
|
try:
|
|
hkey = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r"Typelib\%s\%s.%s\%x\win32" % (libid, wVerMajor, wVerMinor, lcid))
|
|
except WindowsError:
|
|
# On CE, some typelib names are not in the ..\win32 subkey:
|
|
hkey = winreg.OpenKey(winreg.HKEY_CLASSES_ROOT, r"Typelib\%s\%s.%s\%x" % (libid, wVerMajor, wVerMinor, lcid))
|
|
return winreg.QueryValueEx(hkey, "")[0]
|
|
else:
|
|
def QueryPathOfRegTypeLib(libid, wVerMajor, wVerMinor, lcid=0):
|
|
"Return the path of a registered type library"
|
|
pathname = BSTR()
|
|
_oleaut32.QueryPathOfRegTypeLib(byref(GUID(libid)), wVerMajor, wVerMinor, lcid, byref(pathname))
|
|
return pathname.value.split("\0")[0]
|
|
|
|
################################################################
|
|
# Structures
|
|
|
|
class tagTLIBATTR(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 4437
|
|
def __repr__(self):
|
|
return "TLIBATTR(GUID=%s, Version=%s.%s, LCID=%s, FLags=0x%x)" % \
|
|
(self.guid, self.wMajorVerNum, self.wMinorVerNum, self.lcid, self.wLibFlags)
|
|
TLIBATTR = tagTLIBATTR
|
|
|
|
class tagTYPEATTR(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 672
|
|
def __repr__(self):
|
|
return "TYPEATTR(GUID=%s, typekind=%s, funcs=%s, vars=%s, impltypes=%s)" % \
|
|
(self.guid, self.typekind, self.cFuncs, self.cVars, self.cImplTypes)
|
|
TYPEATTR = tagTYPEATTR
|
|
|
|
class tagFUNCDESC(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 769
|
|
def __repr__(self):
|
|
return "FUNCDESC(memid=%s, cParams=%s, cParamsOpt=%s, callconv=%s, invkind=%s, funckind=%s)" % \
|
|
(self.memid, self.cParams, self.cParamsOpt, self.callconv, self.invkind, self.funckind)
|
|
|
|
|
|
FUNCDESC = tagFUNCDESC
|
|
class tagVARDESC(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 803
|
|
pass
|
|
VARDESC = tagVARDESC
|
|
|
|
class tagBINDPTR(Union):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 3075
|
|
pass
|
|
BINDPTR = tagBINDPTR
|
|
class tagTYPEDESC(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 582
|
|
pass
|
|
TYPEDESC = tagTYPEDESC
|
|
class tagIDLDESC(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 633
|
|
pass
|
|
IDLDESC = tagIDLDESC
|
|
|
|
class tagARRAYDESC(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 594
|
|
pass
|
|
|
|
################################################################
|
|
# interface vtbl definitions
|
|
|
|
ICreateTypeLib._methods_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 2149
|
|
COMMETHOD([], HRESULT, 'CreateTypeInfo',
|
|
(['in'], LPOLESTR, 'szName'),
|
|
(['in'], TYPEKIND, 'tkind'),
|
|
(['out'], POINTER(POINTER(ICreateTypeInfo)), 'ppCTInfo')),
|
|
STDMETHOD(HRESULT, 'SetName', [LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetVersion', [WORD, WORD]),
|
|
STDMETHOD(HRESULT, 'SetGuid', [POINTER(GUID)]),
|
|
STDMETHOD(HRESULT, 'SetDocString', [LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetHelpFileName', [LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetHelpContext', [DWORD]),
|
|
STDMETHOD(HRESULT, 'SetLcid', [LCID]),
|
|
STDMETHOD(HRESULT, 'SetLibFlags', [UINT]),
|
|
STDMETHOD(HRESULT, 'SaveAllChanges', []),
|
|
]
|
|
|
|
ICreateTypeLib2._methods_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 2444
|
|
STDMETHOD(HRESULT, 'DeleteTypeInfo', [POINTER(ITypeInfo)]),
|
|
STDMETHOD(HRESULT, 'SetCustData', [POINTER(GUID), POINTER(VARIANT)]),
|
|
STDMETHOD(HRESULT, 'SetHelpStringContext', [ULONG]),
|
|
STDMETHOD(HRESULT, 'SetHelpStringDll', [LPOLESTR]),
|
|
]
|
|
|
|
ITypeLib._methods_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 4455
|
|
COMMETHOD([], UINT, 'GetTypeInfoCount'),
|
|
COMMETHOD([], HRESULT, 'GetTypeInfo',
|
|
(['in'], UINT, 'index'),
|
|
(['out'], POINTER(POINTER(ITypeInfo)))),
|
|
COMMETHOD([], HRESULT, 'GetTypeInfoType',
|
|
(['in'], UINT, 'index'),
|
|
(['out'], POINTER(TYPEKIND))),
|
|
COMMETHOD([], HRESULT, 'GetTypeInfoOfGuid',
|
|
(['in'], POINTER(GUID)),
|
|
(['out'], POINTER(POINTER(ITypeInfo)))),
|
|
COMMETHOD([], HRESULT, 'GetLibAttr',
|
|
(['out'], POINTER(POINTER(TLIBATTR)))),
|
|
COMMETHOD([], HRESULT, 'GetTypeComp',
|
|
(['out'], POINTER(POINTER(ITypeComp)))),
|
|
COMMETHOD([], HRESULT, 'GetDocumentation',
|
|
(['in'], INT, 'index'),
|
|
(['out'], POINTER(BSTR)),
|
|
(['out'], POINTER(BSTR)),
|
|
(['out'], POINTER(DWORD)),
|
|
(['out'], POINTER(BSTR))),
|
|
COMMETHOD([], HRESULT, 'IsName',
|
|
# IsName changes the casing of the passed in name to
|
|
# match that in the type library. In the automatically
|
|
# wrapped version of this method, ctypes would pass a
|
|
# Python unicode string which would then be changed -
|
|
# very bad. So we have (see above) to implement the
|
|
# IsName method manually.
|
|
(['in', 'out'], LPOLESTR, 'name'),
|
|
(['in', 'optional'], DWORD, 'lHashVal', 0),
|
|
(['out'], POINTER(BOOL))),
|
|
STDMETHOD(HRESULT, 'FindName', [LPOLESTR, DWORD, POINTER(POINTER(ITypeInfo)),
|
|
POINTER(MEMBERID), POINTER(USHORT)]),
|
|
COMMETHOD([], None, 'ReleaseTLibAttr',
|
|
(['in'], POINTER(TLIBATTR)))
|
|
]
|
|
|
|
ITypeInfo._methods_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 3230
|
|
COMMETHOD([], HRESULT, 'GetTypeAttr',
|
|
(['out'], POINTER(POINTER(TYPEATTR)), 'ppTypeAttr')),
|
|
COMMETHOD([], HRESULT, 'GetTypeComp',
|
|
(['out'], POINTER(POINTER(ITypeComp)))),
|
|
COMMETHOD([], HRESULT, 'GetFuncDesc',
|
|
(['in'], UINT, 'index'),
|
|
(['out'], POINTER(POINTER(FUNCDESC)))),
|
|
COMMETHOD([], HRESULT, 'GetVarDesc',
|
|
(['in'], UINT, 'index'),
|
|
(['out'], POINTER(POINTER(VARDESC)))),
|
|
STDMETHOD(HRESULT, 'GetNames', [MEMBERID, POINTER(BSTR), UINT, POINTER(UINT)]),
|
|
COMMETHOD([], HRESULT, 'GetRefTypeOfImplType',
|
|
(['in'], UINT, 'index'),
|
|
(['out'], POINTER(HREFTYPE))),
|
|
COMMETHOD([], HRESULT, 'GetImplTypeFlags',
|
|
(['in'], UINT, 'index'),
|
|
(['out'], POINTER(INT))),
|
|
## STDMETHOD(HRESULT, 'GetIDsOfNames', [POINTER(LPOLESTR), UINT, POINTER(MEMBERID)]),
|
|
# this one changed, to accept c_wchar_p array
|
|
STDMETHOD(HRESULT, 'GetIDsOfNames', [POINTER(c_wchar_p), UINT, POINTER(MEMBERID)]),
|
|
STDMETHOD(HRESULT, 'Invoke', [PVOID, MEMBERID, WORD, POINTER(DISPPARAMS), POINTER(VARIANT), POINTER(EXCEPINFO), POINTER(UINT)]),
|
|
|
|
COMMETHOD([], HRESULT, 'GetDocumentation',
|
|
(['in'], MEMBERID, 'memid'),
|
|
(['out'], POINTER(BSTR), 'pBstrName'),
|
|
(['out'], POINTER(BSTR), 'pBstrDocString'),
|
|
(['out'], POINTER(DWORD), 'pdwHelpContext'),
|
|
(['out'], POINTER(BSTR), 'pBstrHelpFile')),
|
|
COMMETHOD([], HRESULT, 'GetDllEntry',
|
|
(['in'], MEMBERID, 'index'),
|
|
(['in'], INVOKEKIND, 'invkind'),
|
|
(['out'], POINTER(BSTR), 'pBstrDllName'),
|
|
(['out'], POINTER(BSTR), 'pBstrName'),
|
|
(['out'], POINTER(WORD), 'pwOrdinal')),
|
|
COMMETHOD([], HRESULT, 'GetRefTypeInfo',
|
|
(['in'], HREFTYPE, 'hRefType'),
|
|
(['out'], POINTER(POINTER(ITypeInfo)))),
|
|
STDMETHOD(HRESULT, 'AddressOfMember', [MEMBERID, INVOKEKIND, POINTER(PVOID)]),
|
|
COMMETHOD([], HRESULT, 'CreateInstance',
|
|
(['in'], POINTER(IUnknown), 'pUnkOuter'),
|
|
(['in'], POINTER(IID), 'refiid'),
|
|
(['out'], POINTER(POINTER(IUnknown)))),
|
|
COMMETHOD([], HRESULT, 'GetMops',
|
|
(['in'], MEMBERID, 'memid'),
|
|
(['out'], POINTER(BSTR))),
|
|
COMMETHOD([], HRESULT, 'GetContainingTypeLib',
|
|
(['out'], POINTER(POINTER(ITypeLib))),
|
|
(['out'], POINTER(UINT))),
|
|
COMMETHOD([], None, 'ReleaseTypeAttr',
|
|
(['in'], POINTER(TYPEATTR))),
|
|
COMMETHOD([], None, 'ReleaseFuncDesc',
|
|
(['in'], POINTER(FUNCDESC))),
|
|
COMMETHOD([], None, 'ReleaseVarDesc',
|
|
(['in'], POINTER(VARDESC))),
|
|
]
|
|
|
|
ITypeComp._methods_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 3090
|
|
STDMETHOD(HRESULT, 'Bind',
|
|
[LPOLESTR, DWORD, WORD, POINTER(POINTER(ITypeInfo)),
|
|
POINTER(DESCKIND), POINTER(BINDPTR)]),
|
|
STDMETHOD(HRESULT, 'BindType',
|
|
[LPOLESTR, DWORD, POINTER(POINTER(ITypeInfo)), POINTER(POINTER(ITypeComp))]),
|
|
]
|
|
|
|
ICreateTypeInfo._methods_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 915
|
|
STDMETHOD(HRESULT, 'SetGuid', [POINTER(GUID)]),
|
|
STDMETHOD(HRESULT, 'SetTypeFlags', [UINT]),
|
|
STDMETHOD(HRESULT, 'SetDocString', [LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetHelpContext', [DWORD]),
|
|
STDMETHOD(HRESULT, 'SetVersion', [WORD, WORD]),
|
|
# STDMETHOD(HRESULT, 'AddRefTypeInfo', [POINTER(ITypeInfo), POINTER(HREFTYPE)]),
|
|
COMMETHOD([], HRESULT, 'AddRefTypeInfo',
|
|
(['in'], POINTER(ITypeInfo)),
|
|
(['out'], POINTER(HREFTYPE))),
|
|
STDMETHOD(HRESULT, 'AddFuncDesc', [UINT, POINTER(FUNCDESC)]),
|
|
STDMETHOD(HRESULT, 'AddImplType', [UINT, HREFTYPE]),
|
|
STDMETHOD(HRESULT, 'SetImplTypeFlags', [UINT, INT]),
|
|
STDMETHOD(HRESULT, 'SetAlignment', [WORD]),
|
|
STDMETHOD(HRESULT, 'SetSchema', [LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'AddVarDesc', [UINT, POINTER(VARDESC)]),
|
|
STDMETHOD(HRESULT, 'SetFuncAndParamNames', [UINT, POINTER(c_wchar_p), UINT]),
|
|
STDMETHOD(HRESULT, 'SetVarName', [UINT, LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetTypeDescAlias', [POINTER(TYPEDESC)]),
|
|
STDMETHOD(HRESULT, 'DefineFuncAsDllEntry', [UINT, LPOLESTR, LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetFuncDocString', [UINT, LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetVarDocString', [UINT, LPOLESTR]),
|
|
STDMETHOD(HRESULT, 'SetFuncHelpContext', [UINT, DWORD]),
|
|
STDMETHOD(HRESULT, 'SetVarHelpContext', [UINT, DWORD]),
|
|
STDMETHOD(HRESULT, 'SetMops', [UINT, BSTR]),
|
|
STDMETHOD(HRESULT, 'SetTypeIdldesc', [POINTER(IDLDESC)]),
|
|
STDMETHOD(HRESULT, 'LayOut', []),
|
|
]
|
|
|
|
class IProvideClassInfo(IUnknown):
|
|
_iid_ = GUID("{B196B283-BAB4-101A-B69C-00AA00341D07}")
|
|
_methods_ = [
|
|
# Returns the ITypeInfo interface for the object's coclass type information.
|
|
COMMETHOD([], HRESULT, "GetClassInfo",
|
|
( ['out'], POINTER(POINTER(ITypeInfo)), "ppTI" ) )
|
|
]
|
|
|
|
class IProvideClassInfo2(IProvideClassInfo):
|
|
_iid_ = GUID("{A6BC3AC0-DBAA-11CE-9DE3-00AA004BB851}")
|
|
_methods_ = [
|
|
# Returns the GUID for the object's outgoing IID for its default event set.
|
|
COMMETHOD([], HRESULT, "GetGUID",
|
|
( ['in'], DWORD, "dwGuidKind" ),
|
|
( ['out', 'retval'], POINTER(GUID), "pGUID" ))
|
|
]
|
|
|
|
|
|
################################################################
|
|
# Structure fields
|
|
|
|
tagTLIBATTR._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 4437
|
|
('guid', GUID),
|
|
('lcid', LCID),
|
|
('syskind', SYSKIND),
|
|
('wMajorVerNum', WORD),
|
|
('wMinorVerNum', WORD),
|
|
('wLibFlags', WORD),
|
|
]
|
|
class N11tagTYPEDESC5DOLLAR_203E(Union):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 584
|
|
pass
|
|
N11tagTYPEDESC5DOLLAR_203E._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 584
|
|
('lptdesc', POINTER(tagTYPEDESC)),
|
|
('lpadesc', POINTER(tagARRAYDESC)),
|
|
('hreftype', HREFTYPE),
|
|
]
|
|
tagTYPEDESC._anonymous_ = ('_',)
|
|
tagTYPEDESC._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 582
|
|
# Unnamed field renamed to '_'
|
|
('_', N11tagTYPEDESC5DOLLAR_203E),
|
|
('vt', VARTYPE),
|
|
]
|
|
tagIDLDESC._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 633
|
|
('dwReserved', ULONG_PTR),
|
|
('wIDLFlags', USHORT),
|
|
]
|
|
tagTYPEATTR._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 672
|
|
('guid', GUID),
|
|
('lcid', LCID),
|
|
('dwReserved', DWORD),
|
|
('memidConstructor', MEMBERID),
|
|
('memidDestructor', MEMBERID),
|
|
('lpstrSchema', LPOLESTR),
|
|
('cbSizeInstance', DWORD),
|
|
('typekind', TYPEKIND),
|
|
('cFuncs', WORD),
|
|
('cVars', WORD),
|
|
('cImplTypes', WORD),
|
|
('cbSizeVft', WORD),
|
|
('cbAlignment', WORD),
|
|
('wTypeFlags', WORD),
|
|
('wMajorVerNum', WORD),
|
|
('wMinorVerNum', WORD),
|
|
('tdescAlias', TYPEDESC),
|
|
('idldescType', IDLDESC),
|
|
]
|
|
class N10tagVARDESC5DOLLAR_205E(Union):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 807
|
|
pass
|
|
N10tagVARDESC5DOLLAR_205E._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 807
|
|
('oInst', DWORD),
|
|
('lpvarValue', POINTER(VARIANT)),
|
|
]
|
|
class tagELEMDESC(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 661
|
|
pass
|
|
class N11tagELEMDESC5DOLLAR_204E(Union):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 663
|
|
pass
|
|
|
|
class tagPARAMDESC(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 609
|
|
pass
|
|
|
|
class tagPARAMDESCEX(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 601
|
|
pass
|
|
LPPARAMDESCEX = POINTER(tagPARAMDESCEX)
|
|
|
|
tagPARAMDESC._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 609
|
|
('pparamdescex', LPPARAMDESCEX),
|
|
('wParamFlags', USHORT),
|
|
]
|
|
PARAMDESC = tagPARAMDESC
|
|
|
|
N11tagELEMDESC5DOLLAR_204E._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 663
|
|
('idldesc', IDLDESC),
|
|
('paramdesc', PARAMDESC),
|
|
]
|
|
tagELEMDESC._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 661
|
|
('tdesc', TYPEDESC),
|
|
# Unnamed field renamed to '_'
|
|
('_', N11tagELEMDESC5DOLLAR_204E),
|
|
]
|
|
ELEMDESC = tagELEMDESC
|
|
|
|
tagVARDESC._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 803
|
|
('memid', MEMBERID),
|
|
('lpstrSchema', LPOLESTR),
|
|
# Unnamed field renamed to '_'
|
|
('_', N10tagVARDESC5DOLLAR_205E),
|
|
('elemdescVar', ELEMDESC),
|
|
('wVarFlags', WORD),
|
|
('varkind', VARKIND),
|
|
]
|
|
tagBINDPTR._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 3075
|
|
('lpfuncdesc', POINTER(FUNCDESC)),
|
|
('lpvardesc', POINTER(VARDESC)),
|
|
('lptcomp', POINTER(ITypeComp)),
|
|
]
|
|
|
|
tagFUNCDESC._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 769
|
|
('memid', MEMBERID),
|
|
('lprgscode', POINTER(SCODE)),
|
|
('lprgelemdescParam', POINTER(ELEMDESC)),
|
|
('funckind', FUNCKIND),
|
|
('invkind', INVOKEKIND),
|
|
('callconv', CALLCONV),
|
|
('cParams', SHORT),
|
|
('cParamsOpt', SHORT),
|
|
('oVft', SHORT),
|
|
('cScodes', SHORT),
|
|
('elemdescFunc', ELEMDESC),
|
|
('wFuncFlags', WORD),
|
|
]
|
|
|
|
tagPARAMDESCEX._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 601
|
|
('cBytes', DWORD),
|
|
('varDefaultValue', VARIANTARG),
|
|
]
|
|
|
|
class tagSAFEARRAYBOUND(Structure):
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 226
|
|
_fields_ = [
|
|
('cElements', DWORD),
|
|
('lLbound', LONG),
|
|
]
|
|
SAFEARRAYBOUND = tagSAFEARRAYBOUND
|
|
|
|
tagARRAYDESC._fields_ = [
|
|
# C:/Programme/gccxml/bin/Vc71/PlatformSDK/oaidl.h 594
|
|
('tdescElem', TYPEDESC),
|
|
('cDims', USHORT),
|
|
('rgbounds', SAFEARRAYBOUND * 1),
|
|
]
|