/ lib / win32com / include / PythonCOMRegister.h
PythonCOMRegister.h
 1  // Support for PythonCOM and its extensions to register the interfaces,
 2  // gateways and IIDs it supports.
 3  //
 4  // The module can simply declare an array of type PyCom_InterfaceSupportInfo, then
 5  // use the macros to populate it.
 6  //
 7  // See Register.cpp and AXScript.cpp for examples on its use.
 8  
 9  #ifndef __PYTHONCOMREGISTER_H__
10  #define __PYTHONCOMREGISTER_H__
11  
12  #include "PythonCOMServer.h"  // Need defns in this file...
13  
14  typedef struct {
15      const GUID *pGUID;             // The supported IID - required
16      const char *interfaceName;     // Name of the interface - required
17      const char *iidName;           // Name of the IID that goes into the dict. - required
18      PyTypeObject *pTypeOb;         // the type object for client PyI* side - NULL for server only support.
19      pfnPyGatewayConstructor ctor;  // Gateway (PyG*) interface constructor - NULL for client only support
20  
21  } PyCom_InterfaceSupportInfo;
22  
23  #define PYCOM_INTERFACE_IID_ONLY(ifc)                   \
24      {                                                   \
25          &IID_I##ifc, "I" #ifc, "IID_I" #ifc, NULL, NULL \
26      }
27  #define PYCOM_INTERFACE_CLSID_ONLY(ifc)                        \
28      {                                                          \
29          &CLSID_##ifc, "CLSID_" #ifc, "CLSID_" #ifc, NULL, NULL \
30      }
31  #define PYCOM_INTERFACE_CATID_ONLY(ifc)                        \
32      {                                                          \
33          &CATID_##ifc, "CATID_" #ifc, "CATID_" #ifc, NULL, NULL \
34      }
35  #define PYCOM_INTERFACE_CLIENT_ONLY(ifc)                           \
36      {                                                              \
37          &IID_I##ifc, "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, NULL \
38      }
39  #define PYCOM_INTERFACE_SERVER_ONLY(ifc)                                        \
40      {                                                                           \
41          &IID_I##ifc, "I" #ifc, "IID_I" #ifc, NULL, GET_PYGATEWAY_CTOR(PyG##ifc) \
42      }
43  #define PYCOM_INTERFACE_FULL(ifc)                                                          \
44      {                                                                                      \
45          &IID_I##ifc, "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, GET_PYGATEWAY_CTOR(PyG##ifc) \
46      }
47  
48  // Versions that use __uuidof() to get the IID, which seems to avoid the need
49  // to link with a lib holding the IIDs.  Note that almost all extensions
50  // build with __uuidof() being the default; the build failed at 'shell' - so
51  // we could consider making this the default and making the 'explicit' version
52  // above the special case.
53  #define PYCOM_INTERFACE_IID_ONLY_UUIDOF(ifc)                  \
54      {                                                         \
55          &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, NULL, NULL \
56      }
57  #define PYCOM_INTERFACE_CLIENT_ONLY_UUIDOF(ifc)                          \
58      {                                                                    \
59          &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, NULL \
60      }
61  #define PYCOM_INTERFACE_SERVER_ONLY_UUIDOF(ifc)                                       \
62      {                                                                                 \
63          &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, NULL, GET_PYGATEWAY_CTOR(PyG##ifc) \
64      }
65  #define PYCOM_INTERFACE_FULL_UUIDOF(ifc)                                                         \
66      {                                                                                            \
67          &__uuidof(I##ifc), "I" #ifc, "IID_I" #ifc, &PyI##ifc::type, GET_PYGATEWAY_CTOR(PyG##ifc) \
68      }
69  
70  // Prototypes for the register functions
71  
72  // Register a PythonCOM extension module
73  PYCOM_EXPORT int PyCom_RegisterExtensionSupport(PyObject *dict, const PyCom_InterfaceSupportInfo *pInterfaces,
74                                                  int numEntries);
75  
76  // THESE SHOULD NO LONGER BE USED.  Instead, use the functions above passing an
77  // array of PyCom_InterfaceSupportInfo objects.
78  
79  PYCOM_EXPORT int PyCom_RegisterClientType(PyTypeObject *typeOb, const GUID *guid);
80  
81  HRESULT PYCOM_EXPORT PyCom_RegisterGatewayObject(REFIID iid, pfnPyGatewayConstructor ctor, const char *interfaceName);
82  PYCOM_EXPORT int PyCom_IsGatewayRegistered(REFIID iid);
83  
84  #endif /* __PYTHONCOMREGISTER_H__ */