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; }
// @pymethod int|PyIDispatchEx|GetDispID|Returns the member id for a name PyObject *PyIDispatchEx::GetDispID(PyObject *self, PyObject *args) { long fdex; PyObject *obName; if (!PyArg_ParseTuple(args, "Ol:GetDispId", &obName, // @pyparm <o PyUnicode>|name||Passed in name to be mapped &fdex)) // @pyparm int|fdex||Determines the options for obtaining the member identifier. This can be a combination of the fdex* constants: return NULL; PyWin_AutoFreeBstr name; if (!PyWinObject_AsAutoFreeBstr(obName, &name)) return NULL; IDispatchEx *pMyDispatchEx = GetI(self); if (pMyDispatchEx==NULL) return NULL; DISPID dispid; PY_INTERFACE_PRECALL; HRESULT hr = pMyDispatchEx->GetDispID(name, (DWORD)fdex, &dispid); PY_INTERFACE_POSTCALL; if (FAILED(hr)) return SetPythonCOMError(self, hr); return PyInt_FromLong(dispid); }
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; }