Michael Curran schrieb:
> Hi,
>
> Attached is a module which contains a definition of the IServiceProvider
> interface. This interface is provided as an interface on COM objects to
> make it possible to switch to a different service, related to the
> object. For example given an IAccessible (MSAA) object, you can use its
> IServiceProvider interface to get to other things such as an
> IHTMLElement (when dealing with MSHTML), or IAccessible2 etc.
> Info on this interface can be found at:
> http://msdn.microsoft.com/en-us/library/cc678965%28VS.85%29.aspx
Generally, the interface seems simple enough (only one method)
and generic enough so that it is justified to add it to the
comtypes\__init__.py module.
It would also be great if you can supply a small code snippet that uses the
IServiceProvider.QueryService method, so that I can make a simple test
for it.
> IServiceProvider is defined in servprov.idl in the Microsoft Platform SDK.
>
> A part from providing a standard comtypes definition of the interface, I
> have also overridden the QueryService method, to be a little more
> pythonic, so that you can pass an interface as the second argument,
> rather than just an IID, and then it actually returns an instance of
> that interface, rather than just an IUnknown pointer.
>
> I propose that this module (servprov.py) be added to comtypes, so that
> others can make use of this, rather than having to code the definition
> manually.
>
> Note also that IServiceProvider is not included in any standard type
> library that I know of, so defining this interface specifically is the
> only way to use it.
>
> Hopefully I have formatted the file suitably for inclusion.
> # -*- coding: mbcs -*-
> from ctypes import *
> from comtypes import *
>
> class IServiceProvider(IUnknown):
> _case_insensitive_ = True
> _iid_ = GUID('{6D5140C1-7436-11CE-8034-00AA006009FA}')
> _idlflags_ = []
I'd suggest to remove the _case_insensitive_ and _idlflags_ attributes.
> #Overridden QueryService to make it nicer to use (passing it an interface
> and it returns a pointer to that interface)
> def QueryService(self,serviceIID,interface):
> if not issubclass(interface,IUnknown):
> raise ValueError("interface argument must be a COM interface")
> interfaceIID=interface._iid_
> if not isinstance(serviceIID,GUID):
> raise ValueError("serviceIID argument must be a GUID")
> p=self._QueryService(byref(serviceIID),byref(interfaceIID))
> return POINTER(interface)(p)
I think the issubclass tests can also be omitted.
>
> IServiceProvider._methods_ = [
> COMMETHOD([], HRESULT, 'QueryService',
> ( ['in'], POINTER(GUID), 'guidService' ),
> ( ['in'], POINTER(GUID), 'riid' ),
> ( ['out'], POINTER(c_void_p), 'ppvObject' )),
> COMMETHOD([], HRESULT, 'RemoteQueryService',
> ( ['in'], POINTER(GUID), 'guidService' ),
> ( ['in'], POINTER(GUID), 'riid' ),
> ( ['out'], POINTER(POINTER(IUnknown)), 'ppvObject' )),
> ]
The definition for 'RemoteQueryService' must be removed. The IServiceProvider
has only ONE method (the midl-compiler sometimes creates C/C++ wrapper methods
called Remote..., but I guess these have somehow to do with marshalling
or something like that).
All in all, this is how I would write this interface:
class IServiceProvider(IUnknown):
_iid_ = GUID('{6D5140C1-7436-11CE-8034-00AA006009FA}')
# Overridden QueryService to make it nicer to use (passing it an
# interface and it returns a pointer to that interface)
def QueryService(self, serviceIID, interface):
p = POINTER(interface)()
self._QueryService(byref(serviceIID), byref(interface._iid_), byref(p))
return p
_methods_ = [
COMMETHOD([], HRESULT, 'QueryService',
( ['in'], POINTER(GUID), 'guidService' ),
( ['in'], POINTER(GUID), 'riid' ),
( ['in'], POINTER(c_void_p), 'ppvObject' ))
]
Does this work for you?
BTW: The reason that the third parameter must be declared 'in' is that
still 'out' parameters are somewhat broken in comtypes.
--
Thanks,
Thomas
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensing option that enables unlimited
royalty-free distribution of the report engine for externally facing
server and web deployment.
http://p.sf.net/sfu/businessobjects
_______________________________________________
comtypes-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/comtypes-users