コード例 #1
0
STDMETHODIMP PyGEnumDebugStackFrames::Next( 
            /* [in] */ ULONG celt,
            /* [length_is][size_is][out] */ DebugStackFrameDescriptor __RPC_FAR *rgVar,
            /* [out] */ ULONG __RPC_FAR *pCeltFetched)
{
	PY_GATEWAY_METHOD;
	PyObject *result;
	Py_ssize_t len;
	HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt);
	if ( FAILED(hr) )
		return hr;

	if ( !PySequence_Check(result) )
		goto error;
	len = PyObject_Length(result);
	if ( len == -1 )
		goto error;
	if ( len > (Py_ssize_t)celt)
		len = celt;

	if ( pCeltFetched )
		*pCeltFetched = PyWin_SAFE_DOWNCAST(len, Py_ssize_t, ULONG);

	Py_ssize_t i;
	for ( i = 0; i < len; ++i )
	{
		PyObject *ob = PySequence_GetItem(result, i);
		if ( ob == NULL )
			goto error;
		if (!PyTuple_Check(ob)) {
			Py_DECREF(ob);
			PyErr_SetString(PyExc_TypeError, "PyIEnumDebugStackFrames::Next must return a tuple.");
			goto error;
		}
		PyObject *obEnum, *obUnk;
		if (!PyArg_ParseTuple(ob, "OiiiO", &obEnum, &rgVar[i].dwMin, &rgVar[i].dwLim, &rgVar[i].fFinal, &obUnk)) {
			Py_DECREF(ob);
			goto error;
		}

		if ( !PyCom_InterfaceFromPyInstanceOrObject(obEnum, IID_IDebugStackFrame, (void **)&rgVar[i].pdsf, FALSE) ||
		     !PyCom_InterfaceFromPyInstanceOrObject(obUnk, IID_IUnknown, (void **)&rgVar[i].punkFinal, TRUE) )
		{
			Py_DECREF(ob);
			Py_DECREF(result);
			return PyCom_SetCOMErrorFromPyException(IID_IEnumDebugStackFrames);
		}
		Py_DECREF(ob);
	}

	Py_DECREF(result);

	return len < (Py_ssize_t)celt ? S_FALSE : S_OK;

  error:
	hr = PyErr_Occurred() ? PyCom_SetCOMErrorFromPyException(IID_IEnumDebugStackFrames)
		                          : PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumDebugStackFrames);
	Py_DECREF(result);
	return hr;
}
コード例 #2
0
PYCOM_EXPORT HRESULT PyCom_SetAndLogCOMErrorFromPyExceptionEx(PyObject *provider, const char *methodName, REFIID riid /* = IID_NULL */)
{
	if (!PyErr_Occurred())
		// No error occurred
		return S_OK;
	PyCom_LoggerNonServerException(provider, "Unexpected exception in gateway method '%s'", methodName);
	return PyCom_SetCOMErrorFromPyException(riid);
}
コード例 #3
0
STDMETHODIMP PyGConnectionPoint::GetConnectionInterface(IID *pIID)
{
	PY_GATEWAY_METHOD;
	if (pIID==NULL) return E_POINTER;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("GetConnectionInterface", &result, NULL);
	if (FAILED(hr)) return hr;
	if (!PyWinObject_AsIID(result, pIID))
		hr = PyCom_SetCOMErrorFromPyException(IID_IConnectionPoint);
	Py_XDECREF(result);
	return hr;
}
コード例 #4
0
STDMETHODIMP PyGConnectionPoint::Advise(IUnknown *pUnk, DWORD *pdwCookie)
{
	PY_GATEWAY_METHOD;
	if (pUnk==NULL || pdwCookie==NULL) return E_POINTER;
	PyObject *obUnknown = PyCom_PyObjectFromIUnknown(pUnk, IID_IUnknown, TRUE); // Take a reference to this object.
	if (obUnknown==NULL)
		return PyCom_SetCOMErrorFromPyException(GetIID());

	PyObject *result = NULL;
	*pdwCookie = 0;
	HRESULT hr = InvokeViaPolicy("Advise", &result, "O", obUnknown);
	Py_DECREF(obUnknown);
	if (FAILED(hr)) return hr;
	*pdwCookie = PyInt_AsLong(result);
	if (PyErr_Occurred()) {
		hr = PyCom_SetCOMErrorFromPyException(GetIID());
		*pdwCookie = 0;
	}
	Py_XDECREF(result);
	return hr;
}
コード例 #5
0
STDMETHODIMP PyGConnectionPoint::GetConnectionPointContainer( IConnectionPointContainer **ppCPC)
{
	PY_GATEWAY_METHOD;
	if (ppCPC==NULL) return E_POINTER;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("GetConnectionPointContainer", &result, NULL);
	if (FAILED(hr)) return hr;
	if (!PyCom_InterfaceFromPyObject(result, IID_IConnectionPointContainer, (void **)ppCPC))
		hr = PyCom_SetCOMErrorFromPyException(GetIID());
	Py_XDECREF(result);
	return hr;
}
コード例 #6
0
ファイル: PyGPropertyBag.cpp プロジェクト: malrsrch/pywin32
STDMETHODIMP PyGPropertyBag::Read(
            /* [in] */ LPCOLESTR pszPropName,
            /* [out][in] */ VARIANT __RPC_FAR *pVar,
            /* [in] */ IErrorLog __RPC_FAR *pErrorLog)
{
	if ( pszPropName == NULL || pVar == NULL )
		return E_POINTER;

	PY_GATEWAY_METHOD;
	PyObject *obLog;
	if ( pErrorLog )
	{
		obLog = PyCom_PyObjectFromIUnknown(pErrorLog, IID_IErrorLog, TRUE);
		if ( !obLog )
			return PyCom_SetCOMErrorFromPyException(GetIID());
	}
	else
	{
		Py_INCREF(Py_None);
		obLog = Py_None;
	}

	PyObject *obName = PyWinObject_FromWCHAR(pszPropName);
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("Read",
									&result,
									"OiO",
									obName,
									(int)V_VT(pVar),
									obLog);

	Py_DECREF(obLog);
	Py_XDECREF(obName);
	if (FAILED(hr)) return hr;
	if (!PyCom_VariantFromPyObject(result, pVar))
		hr = PyCom_SetCOMErrorFromPyException(GetIID());

	Py_DECREF(result);
	return hr;
}
コード例 #7
0
STDMETHODIMP PyGActiveScriptError::GetSourcePosition(DWORD *pdwSourceContext, ULONG *pulLineNumber, LONG *plCharacterPosition)
{
	if (pdwSourceContext==NULL || pulLineNumber==NULL || plCharacterPosition==NULL) return E_POINTER;
	PY_GATEWAY_METHOD;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("GetSourcePosition", &result, NULL);
	if (FAILED(hr))
		return hr;

	if (!PyArg_ParseTuple(result, "iii", pdwSourceContext, pulLineNumber, plCharacterPosition))
		hr = PyCom_SetCOMErrorFromPyException(GetIID());
	Py_DECREF(result);
	return hr;
}
コード例 #8
0
// ---------------------------------------------------
//
// Gateway Implementation
STDMETHODIMP PyGEnumSTATPROPSTG::Next( 
            /* [in] */ ULONG celt,
            /* [length_is][size_is][out] */ STATPROPSTG __RPC_FAR *rgVar,
            /* [out] */ ULONG __RPC_FAR *pCeltFetched)
{
	PY_GATEWAY_METHOD;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt);
	if ( FAILED(hr) )
		return hr;

	if ( !PySequence_Check(result) )
		goto error;
	int len;
	len = PyObject_Length(result);
	if ( len == -1 )
		goto error;
	if ( len > (int)celt)
		len = celt;

	if ( pCeltFetched )
		*pCeltFetched = len;

	int i;
	PyObject *obname;
	for ( i = 0; i < len; ++i )
	{
		TmpPyObject ob = PySequence_GetItem(result, i);
		if ( ob == NULL )
			goto error;

		if (!PyArg_ParseTuple(ob, "OkH", &obname, &rgVar[i].propid, &rgVar[i].vt)
			||!PyWinObject_AsTaskAllocatedWCHAR(obname, &rgVar[i].lpwstrName, TRUE))
		{
			Py_DECREF(result);
			for (; i--; )
				CoTaskMemFree(rgVar[i].lpwstrName);
			return PyCom_SetCOMErrorFromPyException(IID_IEnumSTATPROPSTG);
		}
	}

	Py_DECREF(result);

	return len < (int)celt ? S_FALSE : S_OK;

  error:
	PyErr_Clear();	// just in case
	Py_DECREF(result);
	return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumSTATPROPSTG, "Next() did not return a sequence of objects");
}
コード例 #9
0
STDMETHODIMP PyGEnumVARIANT::Next( 
            /* [in] */ ULONG celt,
            /* [length_is][size_is][out] */ VARIANT __RPC_FAR *rgVar,
            /* [out] */ ULONG __RPC_FAR *pCeltFetched)
{
	PY_GATEWAY_METHOD;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt);
	if ( FAILED(hr) )
		return hr;

	if ( !PySequence_Check(result) )
		goto error;
	int len;
	len = PyObject_Length(result);
	if ( len == -1 )
		goto error;
	if ( len > (int)celt)
		len = celt;

	if ( pCeltFetched )
		*pCeltFetched = len;

	int i;
	for ( i = 0; i < len; ++i )
	{
		PyObject *ob = PySequence_GetItem(result, i);
		if ( ob == NULL )
			goto error;

		if ( !PyCom_VariantFromPyObject(ob, &rgVar[i]) )
		{
			Py_DECREF(ob);
			Py_DECREF(result);
			return PyCom_SetCOMErrorFromPyException(IID_IEnumVARIANT);
		}
		Py_DECREF(ob);
	}

	Py_DECREF(result);

	return len < (int)celt ? S_FALSE : S_OK;

  error:
	PyErr_Clear();	// just in case
	PyCom_LogF("PyGEnumVariant::Next got a bad return value");
	Py_DECREF(result);
	return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumVARIANT, "Next() did not return a sequence of objects");
}
コード例 #10
0
STDMETHODIMP PyGPersistPropertyBag::Load(
            /* [in] */ IPropertyBag __RPC_FAR *pPropBag,
            /* [in] */ IErrorLog __RPC_FAR *pErrorLog)
{
	HRESULT hr;

	if ( pPropBag == NULL )
		return E_POINTER;

	PY_GATEWAY_METHOD;
	PyObject *obLog;
	if ( pErrorLog != NULL )
	{
		obLog = PyCom_PyObjectFromIUnknown(pErrorLog, IID_IErrorLog, TRUE);
		if ( !obLog )
			return PyCom_SetCOMErrorFromPyException(GetIID());
	}
	else
	{
		Py_INCREF(Py_None);
		obLog = Py_None;
	}

	PyObject *obBag = PyCom_PyObjectFromIUnknown(pPropBag, IID_IPropertyBag, TRUE);
	if ( !obBag )
	{
		hr = PyCom_SetCOMErrorFromPyException(GetIID());
		Py_DECREF(obLog);
		return hr;
	}

	hr = InvokeViaPolicy("Load", NULL, "OO", obBag, obLog);
	Py_DECREF(obBag);
	Py_DECREF(obLog);
	return hr;
}
コード例 #11
0
STDMETHODIMP PyGActiveScriptError::GetSourceLineText(BSTR *pbstrSourceLine)
{
	if (pbstrSourceLine==NULL) return E_POINTER;
	PY_GATEWAY_METHOD;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("GetSourceLineText", &result, NULL);
	if (FAILED(hr))
		return hr;

	if (!PyWinObject_AsBstr(result, pbstrSourceLine, TRUE))
		hr = PyCom_SetCOMErrorFromPyException(GetIID());

	Py_DECREF(result);
	return hr;
}
コード例 #12
0
STDMETHODIMP PyGConnectionPointContainer::FindConnectionPoint(REFIID riid, IConnectionPoint **ppCP)
{
	PY_GATEWAY_METHOD;
	if (ppCP==NULL) return E_POINTER;
	*ppCP = NULL;
	PyObject *obIID = PyWinObject_FromIID(riid);
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("FindConnectionPoint", &result, "O", obIID);
	Py_XDECREF(obIID);
	if (FAILED(hr)) return hr;
	if (result != Py_None && !PyCom_InterfaceFromPyObject(result, IID_IConnectionPoint, (void **)ppCP))
		hr = PyCom_SetCOMErrorFromPyException(GetIID());
	Py_XDECREF(result);
	return (hr==S_OK && *ppCP==NULL) ? CONNECT_E_NOCONNECTION : hr;
}
コード例 #13
0
ファイル: PyIShellBrowser.cpp プロジェクト: malrsrch/pywin32
STDMETHODIMP PyGShellBrowser::InsertMenusSB(
		/* [in] */ HMENU hmenuShared,
		/* [out][in] */ LPOLEMENUGROUPWIDTHS lpMenuWidths)
{
	static const char *method_name = "InsertMenusSB";
	PY_GATEWAY_METHOD;
	PyObject *oblpMenuWidths = PyObject_FromOLEMENUGROUPWIDTHS(lpMenuWidths);
	if (oblpMenuWidths==NULL) return MAKE_PYCOM_GATEWAY_FAILURE_CODE(method_name);
	PyObject *result;
	HRESULT hr=InvokeViaPolicy(method_name, &result, "NO", PyWinLong_FromHANDLE(hmenuShared), oblpMenuWidths);
	Py_DECREF(oblpMenuWidths);
	if (FAILED(hr)) return hr;
	PyObject_AsOLEMENUGROUPWIDTHS(result, lpMenuWidths);
	Py_DECREF(result);
	return PyCom_SetCOMErrorFromPyException(GetIID());
}
コード例 #14
0
STDMETHODIMP PyGEnumConnectionPoints::Next( 
            /* [in] */ ULONG celt,
            /* [length_is][size_is][out] */ IConnectionPoint **rgVar,
            /* [out] */ ULONG __RPC_FAR *pCeltFetched)
{
	PY_GATEWAY_METHOD;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt);
	if ( FAILED(hr) )
		return hr;

	if ( !PySequence_Check(result) )
		goto error;
	int len;
	len = PyObject_Length(result);
	if ( len == -1 )
		goto error;
	if ( len > (int)celt)
		len = celt;

	if ( pCeltFetched )
		*pCeltFetched = len;

	int i;
	for ( i = 0; i < len; ++i )
	{
		PyObject *ob = PySequence_GetItem(result, i);
		if ( ob == NULL )
			goto error;

		if ( !PyCom_InterfaceFromPyObject(ob, IID_IConnectionPoint, reinterpret_cast<void **>(&rgVar[i]), FALSE) )
		{
			Py_DECREF(result);
			return PyCom_SetCOMErrorFromPyException(IID_IEnumConnectionPoints);
		}
	}

	Py_DECREF(result);

	return len < (int)celt ? S_FALSE : S_OK;

  error:
	PyErr_Clear();	// just in case
	Py_DECREF(result);
	return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumConnectionPoints);
}
コード例 #15
0
// Std delegation
STDMETHODIMP PyGEnumResources::Next( 
            /* [in] */ ULONG celt,
            /* [out] */ SHELL_ITEM_RESOURCE *rgVar,
            /* [out] */ ULONG *pCeltFetched)
{
	PY_GATEWAY_METHOD;
	PyObject *result;
	HRESULT hr = InvokeViaPolicy("Next", &result, "i", celt);
	if ( FAILED(hr) )
		return hr;

	if ( !PySequence_Check(result) )
		goto error;
	int len;
	len = PyObject_Length(result);
	if ( len == -1 )
		goto error;
	if ( len > (int)celt)
		len = celt;

	if ( pCeltFetched )
		*pCeltFetched = len;

	int i;
	for ( i = 0; i < len; ++i )
	{
		PyObject *ob = PySequence_GetItem(result, i);
		if ( ob == NULL )
			goto error;

		if ( !PyWinObject_AsSHELL_ITEM_RESOURCE(ob, &rgVar[i]))
		{
			Py_DECREF(result);
			return PyCom_SetCOMErrorFromPyException(IID_IEnumResources);
		}
	}

	Py_DECREF(result);

	return len < (int)celt ? S_FALSE : S_OK;

  error:
	PyErr_Clear();	// just in case
	Py_DECREF(result);
	return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumResources, "Next() did not return a sequence of objects");
}
コード例 #16
0
STDMETHODIMP PyGPersistPropertyBag::Save(
            /* [in] */ IPropertyBag __RPC_FAR *pPropBag,
            /* [in] */ BOOL fClearDirty,
            /* [in] */ BOOL fSaveAllProperties)
{
	if ( pPropBag == NULL )
		return E_POINTER;

	PY_GATEWAY_METHOD;
	PyObject *obBag = PyCom_PyObjectFromIUnknown(pPropBag, IID_IPropertyBag, TRUE);
	if ( !obBag )
		return PyCom_SetCOMErrorFromPyException(GetIID());

	HRESULT hr = InvokeViaPolicy("Save",
								 NULL,
								 "Oii",
								 obBag,
								 (int)fClearDirty,
								 (int)fSaveAllProperties);
	Py_DECREF(obBag);
	return hr;
}
コード例 #17
0
ファイル: PyGPropertyBag.cpp プロジェクト: malrsrch/pywin32
STDMETHODIMP PyGPropertyBag::Write(
            /* [in] */ LPCOLESTR pszPropName,
            /* [in] */ VARIANT __RPC_FAR *pVar)
{
	if ( pszPropName == NULL || pVar == NULL )
		return E_POINTER;

	PY_GATEWAY_METHOD;
	PyObject *value = PyCom_PyObjectFromVariant(pVar);
	if ( !value )
		return PyCom_SetCOMErrorFromPyException(GetIID());

	PyObject *obName = PyWinObject_FromWCHAR(pszPropName);
	HRESULT hr = InvokeViaPolicy("Write",
									NULL,
									"OO",
									obName,
									value);
	Py_DECREF(value);
	Py_XDECREF(obName);
	return hr;
}