[python-win32] How to use COM when there isn't a type library or IDL file
Mark Hammond
skippy.hammond at gmail.com
Fri Oct 9 07:11:52 CEST 2009
This is very tricky to do in pure-python. Other interfaces with this
issue (eg, the shell interfaces) tend to use custom c++ code (often
generated by the 'makegw' package then heavily edited) to implement a
win32com 'sub-module'. The best alternative for you may be to
investigate how comtypes might help...
Cheers,
Mark
On 6/10/2009 2:58 AM, Damon Wischik wrote:
> 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;
> };
> _______________________________________________
> python-win32 mailing list
> python-win32 at python.org
> http://mail.python.org/mailman/listinfo/python-win32
More information about the python-win32
mailing list