static HRESULT getDispatchProperty (IDispatch *object, const char *property, VARIANT &value) { BSTR bstr = Utils::str2bstr(property); DISPID dispId; IDispatchEx *pDispatchEx; static IID IDispatchEx_CLSID = { 0xa6ef9860, 0xc720, 0x11d0, {0x93, 0x37, 0x00,0xa0,0xc9,0x0d,0xca,0xa9}}; HRESULT hr = object->QueryInterface(IDispatchEx_CLSID, reinterpret_cast<void**>(&pDispatchEx)) ; if (! FAILED (hr) && pDispatchEx != NULL) { hr = pDispatchEx->GetDispID(bstr, fdexNameEnsure, &dispId); if (FAILED (hr)) { MZNSendDebugMessage("Unable to get property %ls", bstr); } else { DISPPARAMS dp; dp.cArgs = 0; dp.cNamedArgs = 0; dp.rgvarg = NULL; VARIANT result ; result.vt = VT_NULL; UINT error; EXCEPINFO ei; ZeroMemory (&ei, sizeof ei); hr = pDispatchEx->InvokeEx(dispId, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dp, &value, &ei, NULL); if ( FAILED(hr)) { #if 0 MZNSendDebugMessage("Cannot get property %s", property); MZNSendDebugMessage("Error en InvokeEx"); MZNSendDebugMessage("Error en %lX en attributes %d", (long) hr, (int) error); MZNSendDebugMessage("Error code %d ", (int) ei.wCode); MZNSendDebugMessage("Source %ls", ei.bstrSource); MZNSendDebugMessage("Description %ls", ei.bstrDescription); #endif } } pDispatchEx -> Release(); } else { MZNSendDebugMessage("Cannot get IDispatchEx"); } SysFreeString(bstr); return hr; }
static HRESULT setDispatchProperty (IDispatch *object, const char *property, VARIANT &value) { BSTR bstr = Utils::str2bstr(property); DISPID dispId; IDispatchEx *pDispatchEx; static IID IDispatchEx_CLSID = { 0xa6ef9860, 0xc720, 0x11d0, {0x93, 0x37, 0x00,0xa0,0xc9,0x0d,0xca,0xa9}}; HRESULT hr = object->QueryInterface(IDispatchEx_CLSID, reinterpret_cast<void**>(&pDispatchEx)) ; if (! FAILED (hr) && pDispatchEx != NULL) { hr = pDispatchEx->GetDispID(bstr, fdexNameEnsure, &dispId); if (FAILED (hr)) { MZNSendDebugMessage("Unable to create property %ls", bstr); } else { DISPPARAMS dp; dp.cArgs = 1; dp.cNamedArgs = 0; dp.rgvarg = &value; VARIANT result ; result.vt = VT_NULL; UINT error; hr = pDispatchEx->InvokeEx(dispId, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dp, &result, NULL, NULL); if ( !FAILED(hr)) { } else MZNSendDebugMessage("Error en InvokeEx"); } pDispatchEx -> Release(); } else { MZNSendDebugMessage("Cannot get IDispatchEx"); } SysFreeString(bstr); return hr; }
// @pymethod object|PyIDispatchEx|InvokeEx|Provides access to properties and methods exposed by a <o PyIDispatchEx> object. PyObject *PyIDispatchEx::InvokeEx(PyObject *self, PyObject *args) { long dispid; long lcid; int flags; PyObject *invokeArgs; PyObject *types = Py_None; PyObject *obReturnDesc = Py_None; PyObject *obCaller = Py_None; if (!PyArg_ParseTuple(args, "lliO|OOO:InvokeEx", &dispid, // @pyparm int|dispid|| &lcid, // @pyparm int|lcid|| &flags, // @pyparm int|flags|| &invokeArgs, // @pyparm [object, ...]|args||The arguments. &types, // @pyparm [object, ...]|types|None|A tuple of type description object, or None if type descriptions are not available. &obReturnDesc, // @pyparm object\|int|returnDesc|1|If types==None, should be a BOOL indicating if the result is needed. If types is a tuple, then should a be type description. &obCaller)) // @pyparm <o PyIServiceProvider>|serviceProvider|None|A service provider object supplied by the caller which allows the object to obtain services from the caller. Can be None. return NULL; if (!PyTuple_Check(invokeArgs)) { PyErr_SetString(PyExc_TypeError, "The arguments must be a tuple."); return NULL; } // TODO - We do not yet support the Type Description here // (Im not even sure if we need it!) if (types != Py_None || obReturnDesc != Py_None) { PyErr_SetString(PyExc_TypeError, "Type descriptions are not yet supported."); return NULL; } // TODO - Add support for PyIServiceProvider if (obCaller != Py_None) { PyErr_SetString(PyExc_TypeError, "If you really need IServiceProvider support, you are going to have to add it!."); return NULL; } BOOL bResultWanted = TRUE; IDispatchEx *pMyDispatch = GetI(self); if ( pMyDispatch==NULL ) return NULL; DISPPARAMS dispparams; PythonOleArgHelper *helpers; if (!PyCom_MakeUntypedDISPPARAMS(invokeArgs, PyObject_Length(invokeArgs), flags, &dispparams, &helpers )) return NULL; VARIANT varResult; VARIANT *pVarResultUse; if ( bResultWanted ) { VariantInit(&varResult); pVarResultUse = &varResult; } else pVarResultUse = NULL; // initialize EXCEPINFO struct EXCEPINFO excepInfo; memset(&excepInfo, 0, sizeof excepInfo); PY_INTERFACE_PRECALL; HRESULT hr = pMyDispatch->InvokeEx((DISPID)dispid, (LCID)lcid, (WORD)flags, &dispparams, pVarResultUse, &excepInfo, NULL); PY_INTERFACE_POSTCALL; if (!PyCom_FinishUntypedDISPPARAMS(&dispparams, helpers) || HandledDispatchFailure(hr, &excepInfo, (UINT)-1, dispparams.cArgs) ) { if ( pVarResultUse ) VariantClear(pVarResultUse); return NULL; } PyObject *result; if (pVarResultUse) { result = PyCom_PyObjectFromVariant(pVarResultUse); VariantClear(pVarResultUse); } else { result = Py_None; Py_INCREF(result); } return result; }