[python-win32] How to use COM when there isn't a type library or IDL file

Damon Wischik damonwischik at gmail.com
Mon Oct 5 17:58:34 CEST 2009


I am trying to use Microsoft's RealTimeStylus COM classes from Python.
I want to access the RealTimeStylus object, and I want to create
Python objects that support the IStylusAsyncPlugin. The difficulty is
that there is no type library specifying the relevant interfaces, nor
is there an IDL file. All I can find are Microsoft's C/C++ header
files in the Windows 7 SDK. My registry has an entry for the CLSID for
RealTimeStylus, but it doesn't have entries for the interfaces
IRealTimeStylus or IStylusAsyncPlugin.

I know very little about COM, but it seems to me that I should be able
to read through the C/C++ header files for the relevant COM
interfaces, and write a Python equivalent. (I don't think I can use
makepy because there is no type library, and I don't think I can use
the Dispatch approach because (a) RealTimeStylus does not implement
IDispatch and (b) that's no use anyway for server COM.)

I know very little about IDL and about COM, and I have no idea how to
go about translating the C/C++ header files into Python. I would be
very grateful if anyone could give me some tips, or pointers about
what I should read to do this, or correct misconceptions in what I
wrote above.

The stuff below is excerpted from rtscom.h, and it looks like the
interface IRealTimeStylus which I would like to use in Python.

Damon.


#ifndef __IRealTimeStylus_INTERFACE_DEFINED__
#define __IRealTimeStylus_INTERFACE_DEFINED__

/* interface IRealTimeStylus */
/* [unique][helpstring][uuid][object] */


EXTERN_C const IID IID_IRealTimeStylus;

#if defined(__cplusplus) && !defined(CINTERFACE)

    MIDL_INTERFACE("A8BB5D22-3144-4a7b-93CD-F34A16BE513A")
    IRealTimeStylus : public IUnknown
    {
    public:
        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Enabled(
            /* [retval][out] */ __RPC__out BOOL *pfEnable) = 0;

        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Enabled(
            /* [in] */ BOOL fEnable) = 0;

        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_HWND(
            /* [retval][out] */ __RPC__out HANDLE_PTR *phwnd) = 0;

        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_HWND(
            /* [in] */ HANDLE_PTR hwnd) = 0;

        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE
get_WindowInputRectangle(
            /* [retval][out] */ __RPC__out RECT *prcWndInputRect) = 0;

        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE
put_WindowInputRectangle(
            /* [in] */ __RPC__in const RECT *prcWndInputRect) = 0;

        virtual HRESULT STDMETHODCALLTYPE AddStylusSyncPlugin(
            /* [in] */ ULONG iIndex,
            /* [in] */ __RPC__in_opt IStylusSyncPlugin *piPlugin) = 0;

        virtual HRESULT STDMETHODCALLTYPE RemoveStylusSyncPlugin(
            /* [in] */ ULONG iIndex,
            /* [out][in] */ __RPC__deref_inout_opt IStylusSyncPlugin
**ppiPlugin) = 0;

        virtual HRESULT STDMETHODCALLTYPE RemoveAllStylusSyncPlugins( void) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetStylusSyncPlugin(
            /* [in] */ ULONG iIndex,
            /* [out] */ __RPC__deref_out_opt IStylusSyncPlugin **ppiPlugin) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetStylusSyncPluginCount(
            /* [out] */ __RPC__out ULONG *pcPlugins) = 0;

        virtual HRESULT STDMETHODCALLTYPE AddStylusAsyncPlugin(
            /* [in] */ ULONG iIndex,
            /* [in] */ __RPC__in_opt IStylusAsyncPlugin *piPlugin) = 0;

        virtual HRESULT STDMETHODCALLTYPE RemoveStylusAsyncPlugin(
            /* [in] */ ULONG iIndex,
            /* [out][in] */ __RPC__deref_inout_opt IStylusAsyncPlugin
**ppiPlugin) = 0;

        virtual HRESULT STDMETHODCALLTYPE RemoveAllStylusAsyncPlugins(
void) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetStylusAsyncPlugin(
            /* [in] */ ULONG iIndex,
            /* [out] */ __RPC__deref_out_opt IStylusAsyncPlugin
**ppiPlugin) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetStylusAsyncPluginCount(
            /* [out] */ __RPC__out ULONG *pcPlugins) = 0;

        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE
get_ChildRealTimeStylusPlugin(
            /* [retval][out] */ __RPC__deref_out_opt IRealTimeStylus
**ppiRTS) = 0;

        virtual /* [propputref] */ HRESULT STDMETHODCALLTYPE
putref_ChildRealTimeStylusPlugin(
            /* [unique][in] */ __RPC__in_opt IRealTimeStylus *piRTS) = 0;

        virtual HRESULT STDMETHODCALLTYPE AddCustomStylusDataToQueue(
            /* [in] */ StylusQueue sq,
            /* [in] */ __RPC__in const GUID *pGuidId,
            /* [range][in] */ __RPC__in_range(0,0x7fff) ULONG cbData,
            /* [unique][size_is][in] */
__RPC__in_ecount_full_opt(cbData) BYTE *pbData) = 0;

        virtual HRESULT STDMETHODCALLTYPE ClearStylusQueues( void) = 0;

        virtual HRESULT STDMETHODCALLTYPE SetAllTabletsMode(
            /* [in] */ BOOL fUseMouseForInput) = 0;

        virtual HRESULT STDMETHODCALLTYPE SetSingleTabletMode(
            /* [in] */ __RPC__in_opt IInkTablet *piTablet) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetTablet(
            /* [retval][out] */ __RPC__deref_out_opt IInkTablet
**ppiSingleTablet) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetTabletContextIdFromTablet(
            /* [in] */ __RPC__in_opt IInkTablet *piTablet,
            /* [retval][out] */ __RPC__out TABLET_CONTEXT_ID *ptcid) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetTabletFromTabletContextId(
            /* [in] */ TABLET_CONTEXT_ID tcid,
            /* [retval][out] */ __RPC__deref_out_opt IInkTablet
**ppiTablet) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetAllTabletContextIds(
            /* [out][in] */ __RPC__inout ULONG *pcTcidCount,
            /* [size_is][size_is][out] */
__RPC__deref_out_ecount_full_opt(*pcTcidCount) TABLET_CONTEXT_ID
**ppTcids) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetStyluses(
            /* [retval][out] */ __RPC__deref_out_opt IInkCursors
**ppiInkCursors) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetStylusForId(
            /* [in] */ STYLUS_ID sid,
            /* [retval][out] */ __RPC__deref_out_opt IInkCursor
**ppiInkCursor) = 0;

        virtual HRESULT STDMETHODCALLTYPE SetDesiredPacketDescription(
            /* [range][in] */ __RPC__in_range(0,32) ULONG cProperties,
            /* [size_is][in] */ __RPC__in_ecount_full(cProperties)
const GUID *pPropertyGuids) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetDesiredPacketDescription(
            /* [out][in] */ __RPC__inout ULONG *pcProperties,
            /* [size_is][size_is][out] */
__RPC__deref_out_ecount_full_opt(*pcProperties) GUID
**ppPropertyGuids) = 0;

        virtual HRESULT STDMETHODCALLTYPE GetPacketDescriptionData(
            /* [in] */ TABLET_CONTEXT_ID tcid,
            /* [unique][out][in] */ __RPC__inout_opt FLOAT *pfInkToDeviceScaleX,
            /* [unique][out][in] */ __RPC__inout_opt FLOAT *pfInkToDeviceScaleY,
            /* [out][in] */ __RPC__inout ULONG *pcPacketProperties,
            /* [size_is][size_is][out] */
__RPC__deref_out_ecount_full_opt(*pcPacketProperties) PACKET_PROPERTY
**ppPacketProperties) = 0;

    };

#else 	/* C style interface */

    typedef struct IRealTimeStylusVtbl
    {
        BEGIN_INTERFACE

        HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ __RPC__in REFIID riid,
            /* [annotation][iid_is][out] */
            __RPC__deref_out  void **ppvObject);

        ULONG ( STDMETHODCALLTYPE *AddRef )(
            __RPC__in IRealTimeStylus * This);

        ULONG ( STDMETHODCALLTYPE *Release )(
            __RPC__in IRealTimeStylus * This);

        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_Enabled )(
            __RPC__in IRealTimeStylus * This,
            /* [retval][out] */ __RPC__out BOOL *pfEnable);

        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_Enabled )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ BOOL fEnable);

        /* [propget] */ HRESULT ( STDMETHODCALLTYPE *get_HWND )(
            __RPC__in IRealTimeStylus * This,
            /* [retval][out] */ __RPC__out HANDLE_PTR *phwnd);

        /* [propput] */ HRESULT ( STDMETHODCALLTYPE *put_HWND )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ HANDLE_PTR hwnd);

        /* [propget] */ HRESULT ( STDMETHODCALLTYPE
*get_WindowInputRectangle )(
            __RPC__in IRealTimeStylus * This,
            /* [retval][out] */ __RPC__out RECT *prcWndInputRect);

        /* [propput] */ HRESULT ( STDMETHODCALLTYPE
*put_WindowInputRectangle )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ __RPC__in const RECT *prcWndInputRect);

        HRESULT ( STDMETHODCALLTYPE *AddStylusSyncPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ ULONG iIndex,
            /* [in] */ __RPC__in_opt IStylusSyncPlugin *piPlugin);

        HRESULT ( STDMETHODCALLTYPE *RemoveStylusSyncPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ ULONG iIndex,
            /* [out][in] */ __RPC__deref_inout_opt IStylusSyncPlugin
**ppiPlugin);

        HRESULT ( STDMETHODCALLTYPE *RemoveAllStylusSyncPlugins )(
            __RPC__in IRealTimeStylus * This);

        HRESULT ( STDMETHODCALLTYPE *GetStylusSyncPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ ULONG iIndex,
            /* [out] */ __RPC__deref_out_opt IStylusSyncPlugin **ppiPlugin);

        HRESULT ( STDMETHODCALLTYPE *GetStylusSyncPluginCount )(
            __RPC__in IRealTimeStylus * This,
            /* [out] */ __RPC__out ULONG *pcPlugins);

        HRESULT ( STDMETHODCALLTYPE *AddStylusAsyncPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ ULONG iIndex,
            /* [in] */ __RPC__in_opt IStylusAsyncPlugin *piPlugin);

        HRESULT ( STDMETHODCALLTYPE *RemoveStylusAsyncPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ ULONG iIndex,
            /* [out][in] */ __RPC__deref_inout_opt IStylusAsyncPlugin
**ppiPlugin);

        HRESULT ( STDMETHODCALLTYPE *RemoveAllStylusAsyncPlugins )(
            __RPC__in IRealTimeStylus * This);

        HRESULT ( STDMETHODCALLTYPE *GetStylusAsyncPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ ULONG iIndex,
            /* [out] */ __RPC__deref_out_opt IStylusAsyncPlugin **ppiPlugin);

        HRESULT ( STDMETHODCALLTYPE *GetStylusAsyncPluginCount )(
            __RPC__in IRealTimeStylus * This,
            /* [out] */ __RPC__out ULONG *pcPlugins);

        /* [propget] */ HRESULT ( STDMETHODCALLTYPE
*get_ChildRealTimeStylusPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [retval][out] */ __RPC__deref_out_opt IRealTimeStylus **ppiRTS);

        /* [propputref] */ HRESULT ( STDMETHODCALLTYPE
*putref_ChildRealTimeStylusPlugin )(
            __RPC__in IRealTimeStylus * This,
            /* [unique][in] */ __RPC__in_opt IRealTimeStylus *piRTS);

        HRESULT ( STDMETHODCALLTYPE *AddCustomStylusDataToQueue )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ StylusQueue sq,
            /* [in] */ __RPC__in const GUID *pGuidId,
            /* [range][in] */ __RPC__in_range(0,0x7fff) ULONG cbData,
            /* [unique][size_is][in] */
__RPC__in_ecount_full_opt(cbData) BYTE *pbData);

        HRESULT ( STDMETHODCALLTYPE *ClearStylusQueues )(
            __RPC__in IRealTimeStylus * This);

        HRESULT ( STDMETHODCALLTYPE *SetAllTabletsMode )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ BOOL fUseMouseForInput);

        HRESULT ( STDMETHODCALLTYPE *SetSingleTabletMode )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ __RPC__in_opt IInkTablet *piTablet);

        HRESULT ( STDMETHODCALLTYPE *GetTablet )(
            __RPC__in IRealTimeStylus * This,
            /* [retval][out] */ __RPC__deref_out_opt IInkTablet
**ppiSingleTablet);

        HRESULT ( STDMETHODCALLTYPE *GetTabletContextIdFromTablet )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ __RPC__in_opt IInkTablet *piTablet,
            /* [retval][out] */ __RPC__out TABLET_CONTEXT_ID *ptcid);

        HRESULT ( STDMETHODCALLTYPE *GetTabletFromTabletContextId )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ TABLET_CONTEXT_ID tcid,
            /* [retval][out] */ __RPC__deref_out_opt IInkTablet **ppiTablet);

        HRESULT ( STDMETHODCALLTYPE *GetAllTabletContextIds )(
            __RPC__in IRealTimeStylus * This,
            /* [out][in] */ __RPC__inout ULONG *pcTcidCount,
            /* [size_is][size_is][out] */
__RPC__deref_out_ecount_full_opt(*pcTcidCount) TABLET_CONTEXT_ID
**ppTcids);

        HRESULT ( STDMETHODCALLTYPE *GetStyluses )(
            __RPC__in IRealTimeStylus * This,
            /* [retval][out] */ __RPC__deref_out_opt IInkCursors
**ppiInkCursors);

        HRESULT ( STDMETHODCALLTYPE *GetStylusForId )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ STYLUS_ID sid,
            /* [retval][out] */ __RPC__deref_out_opt IInkCursor **ppiInkCursor);

        HRESULT ( STDMETHODCALLTYPE *SetDesiredPacketDescription )(
            __RPC__in IRealTimeStylus * This,
            /* [range][in] */ __RPC__in_range(0,32) ULONG cProperties,
            /* [size_is][in] */ __RPC__in_ecount_full(cProperties)
const GUID *pPropertyGuids);

        HRESULT ( STDMETHODCALLTYPE *GetDesiredPacketDescription )(
            __RPC__in IRealTimeStylus * This,
            /* [out][in] */ __RPC__inout ULONG *pcProperties,
            /* [size_is][size_is][out] */
__RPC__deref_out_ecount_full_opt(*pcProperties) GUID
**ppPropertyGuids);

        HRESULT ( STDMETHODCALLTYPE *GetPacketDescriptionData )(
            __RPC__in IRealTimeStylus * This,
            /* [in] */ TABLET_CONTEXT_ID tcid,
            /* [unique][out][in] */ __RPC__inout_opt FLOAT *pfInkToDeviceScaleX,
            /* [unique][out][in] */ __RPC__inout_opt FLOAT *pfInkToDeviceScaleY,
            /* [out][in] */ __RPC__inout ULONG *pcPacketProperties,
            /* [size_is][size_is][out] */
__RPC__deref_out_ecount_full_opt(*pcPacketProperties) PACKET_PROPERTY
**ppPacketProperties);

        END_INTERFACE
    } IRealTimeStylusVtbl;

    interface IRealTimeStylus
    {
        CONST_VTBL struct IRealTimeStylusVtbl *lpVtbl;
    };


More information about the python-win32 mailing list