Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
// @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;
}