Update of /cvsroot/pywin32/pywin32/com/win32comext/shell/src
In directory sc8-pr-cvs1:/tmp/cvs-serv25779
Modified Files:
PyIShellLink.cpp shell.cpp shell_pch.h
Added Files:
PyIContextMenu.cpp PyIContextMenu.h PyIEnumIDList.cpp
PyIEnumIDList.h PyIExtractIcon.cpp PyIExtractIcon.h
PyIShellExtInit.cpp PyIShellExtInit.h PyIShellFolder.cpp
PyIShellFolder.h
Log Message:
Support lots of new shell interfaces, so we can be a shell extension!
--- NEW FILE: PyIContextMenu.cpp ---
// This file implements the IContextMenu Interface and Gateway for Python.
// Generated by makegw.py
#include "shell_pch.h"
#include "PyIContextMenu.h"
// @doc - This file contains autoduck documentation
// ---------------------------------------------------
//
// Interface Implementation
PyIContextMenu::PyIContextMenu(IUnknown *pdisp):
PyIUnknown(pdisp)
{
ob_type = &type;
}
PyIContextMenu::~PyIContextMenu()
{
}
/* static */ IContextMenu *PyIContextMenu::GetI(PyObject *self)
{
return (IContextMenu *)PyIUnknown::GetI(self);
}
// @pymethod |PyIContextMenu|QueryContextMenu|Description of QueryContextMenu.
PyObject *PyIContextMenu::QueryContextMenu(PyObject *self, PyObject *args)
{
IContextMenu *pICM = GetI(self);
if ( pICM == NULL )
return NULL;
// @pyparm int|hmenu||Description for hmenu
// @pyparm int|indexMenu||Description for indexMenu
// @pyparm int|idCmdFirst||Description for idCmdFirst
// @pyparm int|idCmdLast||Description for idCmdLast
// @pyparm int|uFlags||Description for uFlags
INT hmenu;
UINT indexMenu;
UINT idCmdFirst;
UINT idCmdLast;
UINT uFlags;
if ( !PyArg_ParseTuple(args, "iiiii:QueryContextMenu", &hmenu, &indexMenu, &idCmdFirst, &idCmdLast, &uFlags) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pICM->QueryContextMenu( (HMENU)hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags );
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pICM, IID_IContextMenu );
Py_INCREF(Py_None);
return Py_None;
}
// @pymethod |PyIContextMenu|InvokeCommand|Description of InvokeCommand.
PyObject *PyIContextMenu::InvokeCommand(PyObject *self, PyObject *args)
{
IContextMenu *pICM = GetI(self);
if ( pICM == NULL )
return NULL;
CMINVOKECOMMANDINFO *lpici;
PyObject *oblpici;
if ( !PyArg_ParseTuple(args, "O:InvokeCommand", &oblpici) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsCMINVOKECOMMANDINFO( oblpici, &lpici )) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pICM->InvokeCommand( lpici );
PyObject_FreeCMINVOKECOMMANDINFO(lpici);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pICM, IID_IContextMenu );
Py_INCREF(Py_None);
return Py_None;
}
// @pymethod |PyIContextMenu|GetCommandString|Description of GetCommandString.
PyObject *PyIContextMenu::GetCommandString(PyObject *self, PyObject *args)
{
IContextMenu *pICM = GetI(self);
if ( pICM == NULL )
return NULL;
// @pyparm int|idCmd||Description for idCmd
// @pyparm int|uType||Description for uType
// @pyparm int|cchMax|2048|Description for cchMax
UINT idCmd;
UINT uType;
UINT cchMax = 2048;
if ( !PyArg_ParseTuple(args, "ii|i:GetCommandString", &idCmd, &uType, &cchMax) )
return NULL;
char *buf = (char *)malloc(cchMax);
if (!buf)
return PyErr_NoMemory();
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pICM->GetCommandString( idCmd, uType, NULL, buf, cchMax );
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) ) {
free(buf);
return PyCom_BuildPyException(hr, pICM, IID_IContextMenu );
}
PyObject *ret = PyString_FromString(buf);
free(buf);
return ret;
}
// @object PyIContextMenu|Description of the interface
static struct PyMethodDef PyIContextMenu_methods[] =
{
{ "QueryContextMenu", PyIContextMenu::QueryContextMenu, 1 }, // @pymeth QueryContextMenu|Description of QueryContextMenu
{ "InvokeCommand", PyIContextMenu::InvokeCommand, 1 }, // @pymeth InvokeCommand|Description of InvokeCommand
{ "GetCommandString", PyIContextMenu::GetCommandString, 1 }, // @pymeth GetCommandString|Description of GetCommandString
{ NULL }
};
PyComTypeObject PyIContextMenu::type("PyIContextMenu",
&PyIUnknown::type,
sizeof(PyIContextMenu),
PyIContextMenu_methods,
GET_PYCOM_CTOR(PyIContextMenu));
// ---------------------------------------------------
//
// Gateway Implementation
STDMETHODIMP PyGContextMenu::QueryContextMenu(
/* [unique][in] */ HMENU hmenu,
/* [unique][in] */ UINT indexMenu,
/* [unique][in] */ UINT idCmdFirst,
/* [unique][in] */ UINT idCmdLast,
/* [unique][in] */ UINT uFlags)
{
PY_GATEWAY_METHOD;
PyObject *ret;
HRESULT hr=InvokeViaPolicy("QueryContextMenu", &ret, "iiiii", hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
if (FAILED(hr)) return hr;
if (PyInt_Check(ret))
hr = MAKE_HRESULT(SEVERITY_SUCCESS, 0, PyInt_AsLong(ret));
return hr;
}
STDMETHODIMP PyGContextMenu::InvokeCommand(
/* [unique][in] */ CMINVOKECOMMANDINFO __RPC_FAR * lpici)
{
PY_GATEWAY_METHOD;
// *** The input argument lpici of type "CMINVOKECOMMANDINFO __RPC_FAR *" was not processed ***
// - Please ensure this conversion function exists, and is appropriate
// - The type 'CMINVOKECOMMANDINFO' (lpici) is unknown.
PyObject *oblpici = PyObject_FromCMINVOKECOMMANDINFO(lpici);
if (oblpici==NULL) return PyCom_HandlePythonFailureToCOM();
HRESULT hr=InvokeViaPolicy("InvokeCommand", NULL, "(O)", oblpici);
Py_DECREF(oblpici);
return hr;
}
STDMETHODIMP PyGContextMenu::GetCommandString(
/* [unique][in] */ UINT idCmd,
/* [unique][in] */ UINT uFlags,
/* [unique][in] */ UINT * pwReserved,
/* [unique][in] */ LPSTR pszName,
/* [unique][in] */ UINT cchMax)
{
PyObject *result;
PY_GATEWAY_METHOD;
HRESULT hr=InvokeViaPolicy("GetCommandString", &result, "ii", idCmd, uFlags);
if (FAILED(hr))
return hr;
if (result && (PyString_Check(result) || PyUnicode_Check(result))) {
if (uFlags==GCS_HELPTEXTW || uFlags==GCS_VERBW) {
WCHAR *szResult;
if (PyWinObject_AsWCHAR(result, &szResult, FALSE, NULL)) {
wcsncpy((WCHAR *)pszName, szResult, cchMax);
PyWinObject_FreeWCHAR(szResult);
}
} else {
char *szResult;
if (PyWinObject_AsString(result, &szResult, FALSE, NULL)) {
strncpy(pszName, szResult, cchMax);
PyWinObject_FreeString(szResult);
}
}
hr = S_OK;
} else if (result && PyInt_Check(result)) {
hr = PyInt_AsLong(result) ? S_OK : S_FALSE;
}
Py_DECREF(result);
return hr;
}
--- NEW FILE: PyIContextMenu.h ---
// This file declares the IContextMenu Interface and Gateway for Python.
// Generated by makegw.py
// ---------------------------------------------------
//
// Interface Declaration
class PyIContextMenu : public PyIUnknown
{
public:
MAKE_PYCOM_CTOR(PyIContextMenu);
static IContextMenu *GetI(PyObject *self);
static PyComTypeObject type;
// The Python methods
static PyObject *QueryContextMenu(PyObject *self, PyObject *args);
static PyObject *InvokeCommand(PyObject *self, PyObject *args);
static PyObject *GetCommandString(PyObject *self, PyObject *args);
protected:
PyIContextMenu(IUnknown *pdisp);
~PyIContextMenu();
};
// ---------------------------------------------------
//
// Gateway Declaration
class PyGContextMenu : public PyGatewayBase, public IContextMenu
{
protected:
PyGContextMenu(PyObject *instance) : PyGatewayBase(instance) { ; }
PYGATEWAY_MAKE_SUPPORT2(PyGContextMenu, IContextMenu, IID_IContextMenu, PyGatewayBase)
// IContextMenu
STDMETHOD(QueryContextMenu)(
HMENU hmenu,
UINT indexMenu,
UINT idCmdFirst,
UINT idCmdLast,
UINT uFlags);
STDMETHOD(InvokeCommand)(
CMINVOKECOMMANDINFO __RPC_FAR * lpici);
STDMETHOD(GetCommandString)(
UINT idCmd,
UINT uType,
UINT __RPC_FAR * pwReserved,
LPSTR pszName,
UINT cchMax);
};
--- NEW FILE: PyIEnumIDList.cpp ---
// This file implements the IEnumIDList Interface and Gateway for Python.
// Generated by makegw.py
#include "shell_pch.h"
#include "PyIEnumIDList.h"
// @doc - This file contains autoduck documentation
// ---------------------------------------------------
//
// Interface Implementation
PyIEnumIDList::PyIEnumIDList(IUnknown *pdisp):
PyIUnknown(pdisp)
{
ob_type = &type;
}
PyIEnumIDList::~PyIEnumIDList()
{
}
/* static */ IEnumIDList *PyIEnumIDList::GetI(PyObject *self)
{
return (IEnumIDList *)PyIUnknown::GetI(self);
}
PyObject *
PyIEnumIDList::iter()
{
Py_INCREF(this);
return this;
}
PyObject *
PyIEnumIDList::iternext()
{
ULONG celtFetched = 0;
ITEMIDLIST *pRet;
IEnumIDList *peidl = GetI(this);
if ( peidl == NULL )
return NULL;
PY_INTERFACE_PRECALL;
HRESULT hr = peidl->Next(1, &pRet, &celtFetched);
PY_INTERFACE_POSTCALL;
if ( HRESULT_CODE(hr) != ERROR_NO_MORE_ITEMS && FAILED(hr) )
return PyCom_BuildPyException(hr,peidl, IID_IEnumIDList);
if (celtFetched==0) {
PyErr_SetNone(PyExc_StopIteration);
return NULL;
}
return PyObject_FromPIDL(pRet, TRUE);
}
// @pymethod object|PyIEnumIDList|Next|Retrieves a specified number of items in the enumeration sequence.
PyObject *PyIEnumIDList::Next(PyObject *self, PyObject *args)
{
long celt = 1;
// @pyparm int|num|1|Number of items to retrieve.
if ( !PyArg_ParseTuple(args, "|l:Next", &celt) )
return NULL;
IEnumIDList *peidl = GetI(self);
if ( peidl == NULL )
return NULL;
ITEMIDLIST *rgVar = new ITEMIDLIST [celt];
if ( rgVar == NULL ) {
PyErr_SetString(PyExc_MemoryError, "allocating result ITEMIDLISTs");
return NULL;
}
int i;
/* for ( i = celt; i--; )
// *** possibly init each structure element???
*/
ULONG celtFetched = 0;
PY_INTERFACE_PRECALL;
HRESULT hr = peidl->Next(celt, &rgVar, &celtFetched);
PY_INTERFACE_POSTCALL;
if ( HRESULT_CODE(hr) != ERROR_NO_MORE_ITEMS && FAILED(hr) )
{
delete [] rgVar;
return PyCom_BuildPyException(hr,peidl, IID_IEnumIDList);
}
PyObject *result = PyList_New(celtFetched);
if ( result != NULL )
{
for ( i = celtFetched; i--; )
{
PyObject *ob = PyObject_FromPIDL(rgVar+i, TRUE);
if ( ob == NULL )
{
Py_DECREF(result);
result = NULL;
break;
}
PyList_SET_ITEM(result, i, ob);
}
}
/* for ( i = celtFetched; i--; )
// *** possibly cleanup each structure element???
*/
delete [] rgVar;
return result;
}
// @pymethod |PyIEnumIDList|Skip|Skips over the next specified elementes.
PyObject *PyIEnumIDList::Skip(PyObject *self, PyObject *args)
{
long celt;
if ( !PyArg_ParseTuple(args, "l:Skip", &celt) )
return NULL;
IEnumIDList *peidl = GetI(self);
if ( peidl == NULL )
return NULL;
PY_INTERFACE_PRECALL;
HRESULT hr = peidl->Skip(celt);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, peidl, IID_IEnumIDList);
Py_INCREF(Py_None);
return Py_None;
}
// @pymethod |PyIEnumIDList|Reset|Resets the enumeration sequence to the beginning.
PyObject *PyIEnumIDList::Reset(PyObject *self, PyObject *args)
{
if ( !PyArg_ParseTuple(args, ":Reset") )
return NULL;
IEnumIDList *peidl = GetI(self);
if ( peidl == NULL )
return NULL;
PY_INTERFACE_PRECALL;
HRESULT hr = peidl->Reset();
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, peidl, IID_IEnumIDList);
Py_INCREF(Py_None);
return Py_None;
}
// @pymethod <o PyIEnumIDList>|PyIEnumIDList|Clone|Creates another enumerator that contains the same enumeration state as the current one
PyObject *PyIEnumIDList::Clone(PyObject *self, PyObject *args)
{
if ( !PyArg_ParseTuple(args, ":Clone") )
return NULL;
IEnumIDList *peidl = GetI(self);
if ( peidl == NULL )
return NULL;
IEnumIDList *pClone;
PY_INTERFACE_PRECALL;
HRESULT hr = peidl->Clone(&pClone);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, peidl, IID_IEnumIDList);
return PyCom_PyObjectFromIUnknown(pClone, IID_IEnumIDList, FALSE);
}
// @object PyIEnumIDList|A Python interface to IEnumIDList
static struct PyMethodDef PyIEnumIDList_methods[] =
{
{ "Next", PyIEnumIDList::Next, 1 }, // @pymeth Next|Retrieves a specified number of items in the enumeration sequence.
{ "Skip", PyIEnumIDList::Skip, 1 }, // @pymeth Skip|Skips over the next specified elementes.
{ "Reset", PyIEnumIDList::Reset, 1 }, // @pymeth Reset|Resets the enumeration sequence to the beginning.
{ "Clone", PyIEnumIDList::Clone, 1 }, // @pymeth Clone|Creates another enumerator that contains the same enumeration state as the current one.
{ NULL }
};
PyComTypeObject PyIEnumIDList::type("PyIEnumIDList",
&PyIUnknown::type,
sizeof(PyIEnumIDList),
PyIEnumIDList_methods,
GET_PYCOM_CTOR(PyIEnumIDList));
// ---------------------------------------------------
//
// Gateway Implementation
STDMETHODIMP PyGEnumIDList::Next(
/* [in] */ ULONG celt,
/* [length_is][size_is][out] */ LPITEMIDLIST *pi,
/* [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 ( !PyObject_AsPIDL(ob, &pi[i] ))
{
Py_DECREF(result);
return PyCom_SetCOMErrorFromPyException(IID_IEnumIDList);
}
}
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_IEnumIDList, "Next() did not return a sequence of objects");
}
STDMETHODIMP PyGEnumIDList::Skip(
/* [in] */ ULONG celt)
{
PY_GATEWAY_METHOD;
return InvokeViaPolicy("Skip", NULL, "i", celt);
}
STDMETHODIMP PyGEnumIDList::Reset(void)
{
PY_GATEWAY_METHOD;
return InvokeViaPolicy("Reset");
}
STDMETHODIMP PyGEnumIDList::Clone(
/* [out] */ IEnumIDList __RPC_FAR *__RPC_FAR *ppEnum)
{
PY_GATEWAY_METHOD;
PyObject * result;
HRESULT hr = InvokeViaPolicy("Clone", &result);
if ( FAILED(hr) )
return hr;
/*
** Make sure we have the right kind of object: we should have some kind
** of IUnknown subclass wrapped into a PyIUnknown instance.
*/
if ( !PyIBase::is_object(result, &PyIUnknown::type) )
{
/* the wrong kind of object was returned to us */
Py_DECREF(result);
return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumIDList);
}
/*
** Get the IUnknown out of the thing. note that the Python ob maintains
** a reference, so we don't have to explicitly AddRef() here.
*/
IUnknown *punk = ((PyIUnknown *)result)->m_obj;
if ( !punk )
{
/* damn. the object was released. */
Py_DECREF(result);
return PyCom_SetCOMErrorFromSimple(E_FAIL, IID_IEnumIDList);
}
/*
** Get the interface we want. note it is returned with a refcount.
** This QI is actually going to instantiate a PyGEnumIDList.
*/
Py_BEGIN_ALLOW_THREADS
hr = punk->QueryInterface(IID_IEnumIDList, (LPVOID *)ppEnum);
Py_END_ALLOW_THREADS
/* done with the result; this DECREF is also for <punk> */
Py_DECREF(result);
return PyCom_SetCOMErrorFromSimple(hr, IID_IEnumIDList, "Python could not convert the result from Next() into the required COM interface");
}
--- NEW FILE: PyIEnumIDList.h ---
// This file declares the IEnumIDList Interface and Gateway for Python.
// Generated by makegw.py
// ---------------------------------------------------
//
// Interface Declaration
class PyIEnumIDList : public PyIUnknown
{
public:
MAKE_PYCOM_CTOR(PyIEnumIDList);
static IEnumIDList *GetI(PyObject *self);
static PyComTypeObject type;
virtual PyObject *iter();
virtual PyObject *iternext();
// The Python methods
static PyObject *Next(PyObject *self, PyObject *args);
static PyObject *Skip(PyObject *self, PyObject *args);
static PyObject *Reset(PyObject *self, PyObject *args);
static PyObject *Clone(PyObject *self, PyObject *args);
protected:
PyIEnumIDList(IUnknown *pdisp);
~PyIEnumIDList();
};
// ---------------------------------------------------
//
// Gateway Declaration
class PyGEnumIDList : public PyGatewayBase, public IEnumIDList
{
protected:
PyGEnumIDList(PyObject *instance) : PyGatewayBase(instance) { ; }
PYGATEWAY_MAKE_SUPPORT2(PyGEnumIDList, IEnumIDList, IID_IEnumIDList, PyGatewayBase)
// IEnumIDList
STDMETHOD(Next)(
ULONG celt,
LPITEMIDLIST *pi,
ULONG __RPC_FAR * pcEltsfetched);
STDMETHOD(Skip)(
ULONG celt);
STDMETHOD(Reset)(
void);
STDMETHOD(Clone)(
IEnumIDList __RPC_FAR *__RPC_FAR * ppepi);
};
--- NEW FILE: PyIExtractIcon.cpp ---
// This file implements the IExtractIcon Interface and Gateway for Python.
// Generated by makegw.py
#include "shell_pch.h"
#include "PyIExtractIcon.h"
// @doc - This file contains autoduck documentation
// ---------------------------------------------------
//
// Interface Implementation
PyIExtractIcon::PyIExtractIcon(IUnknown *pdisp):
PyIUnknown(pdisp)
{
ob_type = &type;
}
PyIExtractIcon::~PyIExtractIcon()
{
}
/* static */ IExtractIcon *PyIExtractIcon::GetI(PyObject *self)
{
return (IExtractIcon *)PyIUnknown::GetI(self);
}
// @pymethod |PyIExtractIcon|Extract|Description of Extract.
PyObject *PyIExtractIcon::Extract(PyObject *self, PyObject *args)
{
IExtractIcon *pIEI = GetI(self);
if ( pIEI == NULL )
return NULL;
// @pyparm <o unicode>|pszFile||Description for pszFile
// @pyparm int|nIconIndex||Description for nIconIndex
// @pyparm int|nIconSize||Description for nIconIndex
HICON hiconLarge;
HICON hiconSmall;
PyObject *obpszFile;
TCHAR *pszFile;
UINT nIconIndex;
UINT nIconSize;
if ( !PyArg_ParseTuple(args, "Oii:Extract", &obpszFile, &nIconIndex, &nIconSize) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (!PyWinObject_AsTCHAR(obpszFile, &pszFile)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pIEI->Extract( pszFile, nIconIndex, &hiconLarge, &hiconSmall, nIconSize );
PyWinObject_FreeTCHAR(pszFile);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pIEI, IID_IExtractIcon );
return Py_BuildValue("ii", hiconLarge, hiconSmall);
Py_INCREF(Py_None);
return Py_None;
}
// @pymethod |PyIExtractIcon|GetIconLocation|Description of GetIconLocation.
PyObject *PyIExtractIcon::GetIconLocation(PyObject *self, PyObject *args)
{
IExtractIcon *pIEI = GetI(self);
if ( pIEI == NULL )
return NULL;
// @pyparm int|uFlags||Description for uFlags
// @pyparm int|cchMax|MAX_PATH+MAX_FNAME|Buffer size to allocate for file name
UINT uFlags;
INT cchMax = MAX_PATH + _MAX_FNAME;
if ( !PyArg_ParseTuple(args, "i|i:GetIconLocation", &uFlags, &cchMax))
return NULL;
TCHAR *buf = (char *)malloc(cchMax * sizeof(TCHAR));
if (!buf)
return PyErr_NoMemory();
INT iIndex;
UINT flags;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pIEI->GetIconLocation( uFlags, buf, cchMax, &iIndex, &flags);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) ) {
free(buf);
return PyCom_BuildPyException(hr, pIEI, IID_IExtractIcon );
}
PyObject *retStr = PyWinObject_FromTCHAR(buf);
free(buf);
return Py_BuildValue("Nii", retStr, iIndex, flags);
}
// @object PyIExtractIcon|Description of the interface
static struct PyMethodDef PyIExtractIcon_methods[] =
{
{ "Extract", PyIExtractIcon::Extract, 1 }, // @pymeth Extract|Description of Extract
{ "GetIconLocation", PyIExtractIcon::GetIconLocation, 1 }, // @pymeth GetIconLocation|Description of GetIconLocation
{ NULL }
};
PyComTypeObject PyIExtractIcon::type("PyIExtractIcon",
&PyIUnknown::type,
sizeof(PyIExtractIcon),
PyIExtractIcon_methods,
GET_PYCOM_CTOR(PyIExtractIcon));
// ---------------------------------------------------
//
// Gateway Implementation
STDMETHODIMP PyGExtractIcon::Extract(
/* [unique][in] */ LPCSTR pszFile,
/* [unique][in] */ UINT nIconIndex,
/* [out] */ HICON * phiconLarge,
/* [out] */ HICON * phiconSmall,
/* [unique][in] */ UINT nIconSize)
{
PY_GATEWAY_METHOD;
PyObject *obpszFile;
obpszFile = PyWinObject_FromTCHAR((LPSTR)pszFile);
PyObject *result;
HRESULT hr=InvokeViaPolicy("Extract", &result, "Oii", obpszFile, nIconIndex, nIconSize);
Py_XDECREF(obpszFile);
if (FAILED(hr)) return hr;
PyArg_ParseTuple(result, "ii", phiconLarge, phiconSmall);
return PyCom_HandlePythonFailureToCOM();
}
STDMETHODIMP PyGExtractIcon::GetIconLocation(
/* [unique][in] */ UINT uFlags,
/* [unique][out] */ LPSTR szIconFile,
/* [unique][in] */ UINT cchMax,
/* [unique][out] */ LPINT piIndex,
/* [unique][out] */ UINT *pflags)
{
PY_GATEWAY_METHOD;
PyObject *result;
HRESULT hr=InvokeViaPolicy("GetIconLocation", &result, "i", uFlags);
if (FAILED(hr)) return hr;
PyObject *obFileName;
// Process the Python results, and convert back to the real params
if (result==Py_None)
hr = S_FALSE;
else {
if (PyArg_ParseTuple(result, "Oii", &obFileName, piIndex, pflags)) {
TCHAR *filename;
if (PyWinObject_AsTCHAR(obFileName, &filename)) {
_tcsncpy(filename, szIconFile, cchMax);
PyWinObject_FreeTCHAR(filename);
}
}
hr = PyCom_HandlePythonFailureToCOM();
}
Py_DECREF(result);
return hr;
}
--- NEW FILE: PyIExtractIcon.h ---
// This file declares the IExtractIcon Interface and Gateway for Python.
// Generated by makegw.py
// ---------------------------------------------------
//
// Interface Declaration
class PyIExtractIcon : public PyIUnknown
{
public:
MAKE_PYCOM_CTOR(PyIExtractIcon);
static IExtractIcon *GetI(PyObject *self);
static PyComTypeObject type;
// The Python methods
static PyObject *Extract(PyObject *self, PyObject *args);
static PyObject *GetIconLocation(PyObject *self, PyObject *args);
protected:
PyIExtractIcon(IUnknown *pdisp);
~PyIExtractIcon();
};
// ---------------------------------------------------
//
// Gateway Declaration
class PyGExtractIcon : public PyGatewayBase, public IExtractIcon
{
protected:
PyGExtractIcon(PyObject *instance) : PyGatewayBase(instance) { ; }
PYGATEWAY_MAKE_SUPPORT2(PyGExtractIcon, IExtractIcon, IID_IExtractIcon, PyGatewayBase)
// IExtractIcon
STDMETHOD(Extract)(
LPCSTR pszFile,
UINT nIconIndex,
HICON * phiconLarge,
HICON * phiconSmall,
UINT nIconSize);
STDMETHOD(GetIconLocation)(
UINT uFlags,
LPSTR szIconFile,
UINT cchMax,
LPINT piIndex,
UINT *pwFlags);
};
--- NEW FILE: PyIShellExtInit.cpp ---
// This file implements the IShellExtInit Interface and Gateway for Python.
// Generated by makegw.py
#include "shell_pch.h"
#include "PyIShellExtInit.h"
// @doc - This file contains autoduck documentation
// ---------------------------------------------------
//
// Interface Implementation
PyIShellExtInit::PyIShellExtInit(IUnknown *pdisp):
PyIUnknown(pdisp)
{
ob_type = &type;
}
PyIShellExtInit::~PyIShellExtInit()
{
}
/* static */ IShellExtInit *PyIShellExtInit::GetI(PyObject *self)
{
return (IShellExtInit *)PyIUnknown::GetI(self);
}
// @pymethod |PyIShellExtInit|Initialize|Description of Initialize.
PyObject *PyIShellExtInit::Initialize(PyObject *self, PyObject *args)
{
IShellExtInit *pISEI = GetI(self);
if ( pISEI == NULL )
return NULL;
// @pyparm <o PyIDL>|pFolder||Description for pFolder
// @pyparm <o PyIDataObject *>|pDataObject||Description for pDataObject
// @pyparm <o PyHANDLE>|hkey||Description for hkey
PyObject *obpFolder;
PyObject *obpDataObject;
PyObject *obhkey;
LPITEMIDLIST pFolder;
IDataObject *pDataObject;
HKEY hkey;
if ( !PyArg_ParseTuple(args, "OOO:Initialize", &obpFolder, &obpDataObject, &obhkey) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (!PyObject_AsPIDL(obpFolder, &pFolder)) bPythonIsHappy = FALSE;
// XXX - no IDataObject support
if (!PyCom_InterfaceFromPyInstanceOrObject(obpDataObject, IID_IUnknown, (void **)&pDataObject, TRUE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (!PyWinObject_AsHANDLE(obhkey, (HANDLE *)&hkey, FALSE)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISEI->Initialize( pFolder, pDataObject, hkey );
PyObject_FreePIDL(pFolder);
if (pDataObject) pDataObject->Release();
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISEI, IID_IShellExtInit );
Py_INCREF(Py_None);
return Py_None;
}
// @object PyIShellExtInit|Description of the interface
static struct PyMethodDef PyIShellExtInit_methods[] =
{
{ "Initialize", PyIShellExtInit::Initialize, 1 }, // @pymeth Initialize|Description of Initialize
{ NULL }
};
PyComTypeObject PyIShellExtInit::type("PyIShellExtInit",
&PyIUnknown::type,
sizeof(PyIShellExtInit),
PyIShellExtInit_methods,
GET_PYCOM_CTOR(PyIShellExtInit));
// ---------------------------------------------------
//
// Gateway Implementation
STDMETHODIMP PyGShellExtInit::Initialize(
/* [unique][in] */ LPCITEMIDLIST pFolder,
/* [unique][in] */ IDataObject * pDataObject,
/* [unique][in] */ HKEY hkey)
{
PY_GATEWAY_METHOD;
PyObject *obpFolder;
PyObject *obpDataObject;
obpFolder = PyObject_FromPIDL(pFolder, FALSE);
// XXX - no IDataObject support
obpDataObject = PyCom_PyObjectFromIUnknown(pDataObject, IID_IUnknown, TRUE);
HRESULT hr=InvokeViaPolicy("Initialize", NULL, "OOi", obpFolder, obpDataObject, hkey);
Py_XDECREF(obpFolder);
Py_XDECREF(obpDataObject);
return hr;
}
--- NEW FILE: PyIShellExtInit.h ---
// This file declares the IShellExtInit Interface and Gateway for Python.
// Generated by makegw.py
// ---------------------------------------------------
//
// Interface Declaration
class PyIShellExtInit : public PyIUnknown
{
public:
MAKE_PYCOM_CTOR(PyIShellExtInit);
static IShellExtInit *GetI(PyObject *self);
static PyComTypeObject type;
// The Python methods
static PyObject *Initialize(PyObject *self, PyObject *args);
protected:
PyIShellExtInit(IUnknown *pdisp);
~PyIShellExtInit();
};
// ---------------------------------------------------
//
// Gateway Declaration
class PyGShellExtInit : public PyGatewayBase, public IShellExtInit
{
protected:
PyGShellExtInit(PyObject *instance) : PyGatewayBase(instance) { ; }
PYGATEWAY_MAKE_SUPPORT2(PyGShellExtInit, IShellExtInit, IID_IShellExtInit, PyGatewayBase)
// IShellExtInit
STDMETHOD(Initialize)(
LPCITEMIDLIST pFolder,
IDataObject * pDataObject,
HKEY hkey);
};
--- NEW FILE: PyIShellFolder.cpp ---
// This file implements the IShellFolder Interface and Gateway for Python.
// Generated by makegw.py
#include "shell_pch.h"
#include "PyIShellFolder.h"
// @doc - This file contains autoduck documentation
// ---------------------------------------------------
//
// Interface Implementation
PyIShellFolder::PyIShellFolder(IUnknown *pdisp):
PyIUnknown(pdisp)
{
ob_type = &type;
}
PyIShellFolder::~PyIShellFolder()
{
}
/* static */ IShellFolder *PyIShellFolder::GetI(PyObject *self)
{
return (IShellFolder *)PyIUnknown::GetI(self);
}
// @pymethod |PyIShellFolder|ParseDisplayName|Description of ParseDisplayName.
PyObject *PyIShellFolder::ParseDisplayName(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm HWND|hwndOwner||Description for hwndOwner
// @pyparm <o PyIBindCtx>|pbcReserved||Description for pbcReserved
// @pyparm <o unicode>|lpszDisplayName||Description for lpszDisplayName
PyObject *obpbcReserved;
PyObject *oblpszDisplayName;
HWND hwndOwner;
IBindCtx * pbcReserved;
LPOLESTR lpszDisplayName;
ULONG pchEaten;
ITEMIDLIST *ppidl;
ULONG pdwAttributes;
if ( !PyArg_ParseTuple(args, "lOO:ParseDisplayName", &hwndOwner, &obpbcReserved, &oblpszDisplayName) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obpbcReserved, IID_IBindCtx, (void **)&pbcReserved, TRUE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyWinObject_AsBstr(oblpszDisplayName, &lpszDisplayName)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->ParseDisplayName( hwndOwner, pbcReserved, lpszDisplayName, &pchEaten, &ppidl, &pdwAttributes );
if (pbcReserved) pbcReserved->Release();
SysFreeString(lpszDisplayName);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
PyObject *obppidl;
obppidl = PyObject_FromPIDL(ppidl, TRUE);
PyObject *pyretval = Py_BuildValue("lOl", pchEaten, obppidl, pdwAttributes);
Py_XDECREF(obppidl);
return pyretval;
}
// @pymethod |PyIShellFolder|EnumObjects|Description of EnumObjects.
PyObject *PyIShellFolder::EnumObjects(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm HWND|hwndOwner||Description for hwndOwner
// @pyparm int|grfFlags||Description for grfFlags
HWND hwndOwner;
DWORD grfFlags;
IEnumIDList * ppeidl;
if ( !PyArg_ParseTuple(args, "ll:EnumObjects", &hwndOwner, &grfFlags) )
return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->EnumObjects( hwndOwner, grfFlags, &ppeidl );
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
return PyCom_PyObjectFromIUnknown(ppeidl, IID_IEnumIDList, FALSE);
}
// @pymethod |PyIShellFolder|BindToObject|Description of BindToObject.
PyObject *PyIShellFolder::BindToObject(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm <o PyIDL>|pidl||Description for pidl
// @pyparm <o PyIBindCtx>|pbcReserved||Description for pbcReserved
// @pyparm <o PyIID>|riid||Description for riid
PyObject *obpidl;
PyObject *obpbcReserved;
PyObject *obriid;
ITEMIDLIST *pidl;
IBindCtx * pbcReserved;
IID riid;
void * out;
if ( !PyArg_ParseTuple(args, "OOO:BindToObject", &obpidl, &obpbcReserved, &obriid) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDL(obpidl, &pidl)) bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obpbcReserved, IID_IBindCtx, (void **)&pbcReserved, TRUE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (!PyWinObject_AsIID(obriid, &riid)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->BindToObject( pidl, pbcReserved, riid, &out );
PyObject_FreePIDL(pidl);
if (pbcReserved) pbcReserved->Release();
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
return PyCom_PyObjectFromIUnknown((IUnknown *)out, riid, FALSE);
}
// @pymethod |PyIShellFolder|BindToStorage|Description of BindToStorage.
PyObject *PyIShellFolder::BindToStorage(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm <o PyIDL>|pidl||Description for pidl
// @pyparm <o PyIBindCtx>|pbcReserved||Description for pbcReserved
// @pyparm <o PyIID>|riid||Description for riid
PyObject *obpidl;
PyObject *obpbcReserved;
PyObject *obriid;
ITEMIDLIST *pidl;
IBindCtx * pbcReserved;
IID riid;
void * out;
if ( !PyArg_ParseTuple(args, "OOO:BindToStorage", &obpidl, &obpbcReserved, &obriid) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDL(obpidl, &pidl)) bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obpbcReserved, IID_IBindCtx, (void **)&pbcReserved, TRUE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (!PyWinObject_AsIID(obriid, &riid)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->BindToStorage( pidl, pbcReserved, riid, &out );
PyObject_FreePIDL(pidl);
if (pbcReserved) pbcReserved->Release();
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
return PyCom_PyObjectFromIUnknown((IUnknown *)out, riid, FALSE);
}
// @pymethod int|PyIShellFolder|CompareIDs|Description of CompareIDs.
PyObject *PyIShellFolder::CompareIDs(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm int|lparam||Description for lparam
// @pyparm <o PyIDL>|pidl1||Description for pidl1
// @pyparm <o PyIDL>|pidl2||Description for pidl2
PyObject *obpidl1;
PyObject *obpidl2;
long lparam;
ITEMIDLIST *pidl1;
ITEMIDLIST *pidl2;
if ( !PyArg_ParseTuple(args, "lOO:CompareIDs", &lparam, &obpidl1, &obpidl2) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDL(obpidl1, &pidl1)) bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyObject_AsPIDL(obpidl2, &pidl2)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->CompareIDs( lparam, pidl1, pidl2 );
PyObject_FreePIDL(pidl1);
PyObject_FreePIDL(pidl2);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
// special handling of hresult
if ((short)HRESULT_CODE(hr) < 0)
/* pidl1 comes first */
return PyInt_FromLong(-1);
else if ((short)HRESULT_CODE(hr) > 0)
/* pidl2 comes first */
return PyInt_FromLong(1);
else
/* the two pidls are equal */
return PyInt_FromLong(0);
}
// @pymethod |PyIShellFolder|CreateViewObject|Description of CreateViewObject.
PyObject *PyIShellFolder::CreateViewObject(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm HWND|hwndOwner||Description for hwndOwner
// @pyparm <o PyIID>|riid||Description for riid
PyObject *obriid;
HWND hwndOwner;
IID riid;
void * out;
if ( !PyArg_ParseTuple(args, "lO:CreateViewObject", &hwndOwner, &obriid) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (!PyWinObject_AsIID(obriid, &riid)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->CreateViewObject( hwndOwner, riid, &out );
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
return PyCom_PyObjectFromIUnknown((IUnknown *)out, riid, FALSE);
}
// @pymethod |PyIShellFolder|GetAttributesOf|Description of GetAttributesOf.
PyObject *PyIShellFolder::GetAttributesOf(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm <o PyIDL>|pidl||Description for pidl
// @pyparm int|rgfInOut||Description for rgfInOut
PyObject *obpidl;
UINT cidl;
LPCITEMIDLIST *pidl;
ULONG rgfInOut;
if ( !PyArg_ParseTuple(args, "Ol:GetAttributesOf", &obpidl, &rgfInOut) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDLArray(obpidl, &cidl, &pidl)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->GetAttributesOf( cidl, pidl, &rgfInOut );
PyObject_FreePIDLArray(cidl, pidl);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
return PyInt_FromLong(rgfInOut);
}
// @pymethod |PyIShellFolder|GetUIObjectOf|Description of GetUIObjectOf.
PyObject *PyIShellFolder::GetUIObjectOf(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm HWND|hwndOwner||Description for hwndOwner
// @pyparm <o PyIDL>|pidl||Description for pidl
// @pyparm <o PyIID>|riid||Description for riid
// @pyparm int|rgfInOut||Description for rgfInOut
PyObject *obpidl;
PyObject *obriid;
HWND hwndOwner;
UINT cidl;
LPCITEMIDLIST *pidl;
IID riid;
UINT rgfInOut;
void * out;
if ( !PyArg_ParseTuple(args, "lOOl:GetUIObjectOf", &hwndOwner, &obpidl, &obriid, &rgfInOut) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDLArray(obpidl, &cidl, &pidl)) bPythonIsHappy = FALSE;
if (!PyWinObject_AsIID(obriid, &riid)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->GetUIObjectOf( hwndOwner, cidl, pidl, riid, &rgfInOut, &out );
PyObject_FreePIDLArray(cidl, pidl);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
PyObject *obout;
obout = PyCom_PyObjectFromIUnknown((IUnknown *)out, riid, FALSE);
PyObject *pyretval = Py_BuildValue("lO", rgfInOut, obout);
Py_XDECREF(obout);
return pyretval;
}
// @pymethod |PyIShellFolder|GetDisplayNameOf|Description of GetDisplayNameOf.
PyObject *PyIShellFolder::GetDisplayNameOf(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm <o PyIDL>|pidl||Description for pidl
// @pyparm int|uFlags||Description for uFlags
PyObject *obpidl;
ITEMIDLIST *pidl;
DWORD uFlags;
if ( !PyArg_ParseTuple(args, "Ol:GetDisplayNameOf", &obpidl, &uFlags) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDL(obpidl, &pidl)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
STRRET out;
PY_INTERFACE_PRECALL;
hr = pISF->GetDisplayNameOf( pidl, uFlags, &out );
PyObject_FreePIDL(pidl);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
return PyObject_FromSTRRET(&out, pidl, TRUE);
}
// @pymethod |PyIShellFolder|SetNameOf|Description of SetNameOf.
PyObject *PyIShellFolder::SetNameOf(PyObject *self, PyObject *args)
{
IShellFolder *pISF = GetI(self);
if ( pISF == NULL )
return NULL;
// @pyparm HWND|hwndOwner||Description for hwndOwner
// @pyparm <o PyIDL>|pidl||Description for pidl
// @pyparm <o unicode>|lpszName||Description for lpszName
PyObject *obpidl;
PyObject *oblpszName;
HWND hwndOwner;
ITEMIDLIST *pidl;
ITEMIDLIST *pidlRet;
LPOLESTR lpszName;
long flags;
if ( !PyArg_ParseTuple(args, "lOOl:SetNameOf", &hwndOwner, &obpidl, &oblpszName, &flags) )
return NULL;
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDL(obpidl, &pidl)) bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyWinObject_AsBstr(oblpszName, &lpszName)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pISF->SetNameOf( hwndOwner, pidl, lpszName, (SHGDNF)flags, &pidlRet );
PyObject_FreePIDL(pidl);
SysFreeString(lpszName);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pISF, IID_IShellFolder );
PyObject *ret = PyObject_FromPIDL(pidlRet, TRUE);
Py_INCREF(Py_None);
return Py_None;
}
// @object PyIShellFolder|Description of the interface
static struct PyMethodDef PyIShellFolder_methods[] =
{
{ "ParseDisplayName", PyIShellFolder::ParseDisplayName, 1 }, // @pymeth ParseDisplayName|Description of ParseDisplayName
{ "EnumObjects", PyIShellFolder::EnumObjects, 1 }, // @pymeth EnumObjects|Description of EnumObjects
{ "BindToObject", PyIShellFolder::BindToObject, 1 }, // @pymeth BindToObject|Description of BindToObject
{ "BindToStorage", PyIShellFolder::BindToStorage, 1 }, // @pymeth BindToStorage|Description of BindToStorage
{ "CompareIDs", PyIShellFolder::CompareIDs, 1 }, // @pymeth CompareIDs|Description of CompareIDs
{ "CreateViewObject", PyIShellFolder::CreateViewObject, 1 }, // @pymeth CreateViewObject|Description of CreateViewObject
{ "GetAttributesOf", PyIShellFolder::GetAttributesOf, 1 }, // @pymeth GetAttributesOf|Description of GetAttributesOf
{ "GetUIObjectOf", PyIShellFolder::GetUIObjectOf, 1 }, // @pymeth GetUIObjectOf|Description of GetUIObjectOf
{ "GetDisplayNameOf", PyIShellFolder::GetDisplayNameOf, 1 }, // @pymeth GetDisplayNameOf|Description of GetDisplayNameOf
{ "SetNameOf", PyIShellFolder::SetNameOf, 1 }, // @pymeth SetNameOf|Description of SetNameOf
{ NULL }
};
PyComTypeObject PyIShellFolder::type("PyIShellFolder",
&PyIUnknown::type,
sizeof(PyIShellFolder),
PyIShellFolder_methods,
GET_PYCOM_CTOR(PyIShellFolder));
// ---------------------------------------------------
//
// Gateway Implementation
STDMETHODIMP PyGShellFolder::ParseDisplayName(
/* [unique][in] */ HWND hwndOwner,
/* [unique][in] */ LPBC pbcReserved,
/* [unique][in] */ LPOLESTR lpszDisplayName,
/* [out] */ ULONG __RPC_FAR * pchEaten,
/* [out] */ LPITEMIDLIST *ppidl,
/* [out] */ ULONG __RPC_FAR * pdwAttributes)
{
PY_GATEWAY_METHOD;
*ppidl = NULL;
PyObject *obpbcReserved;
PyObject *oblpszDisplayName;
obpbcReserved = PyCom_PyObjectFromIUnknown(pbcReserved, IID_IBindCtx, TRUE);
oblpszDisplayName = MakeOLECHARToObj(lpszDisplayName);
PyObject *result;
HRESULT hr=InvokeViaPolicy("ParseDisplayName", &result, "lOO", hwndOwner, obpbcReserved, oblpszDisplayName);
Py_XDECREF(obpbcReserved);
Py_XDECREF(oblpszDisplayName);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
PyObject *obppidl;
if (!PyArg_ParseTuple(result, "lOl" , pchEaten, &obppidl, pdwAttributes)) return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyObject_AsPIDL(obppidl, ppidl)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::EnumObjects(
/* [unique][in] */ HWND hwndOwner,
/* [unique][in] */ DWORD grfFlags,
/* [out] */ IEnumIDList __RPC_FAR ** ppeidl)
{
PY_GATEWAY_METHOD;
PyObject *result;
HRESULT hr=InvokeViaPolicy("EnumObjects", &result, "ll", hwndOwner, grfFlags);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
PyObject *obppeidl;
if (!PyArg_Parse(result, "O" , &obppeidl)) return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obppeidl, IID_IEnumIDList, (void **)&ppeidl, FALSE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::BindToObject(
/* [unique][in] */ LPCITEMIDLIST pidl,
/* [unique][in] */ LPBC pbcReserved,
/* [unique][in] */ REFIID riid,
/* [out] */ void ** out)
{
PY_GATEWAY_METHOD;
PyObject *obpidl;
PyObject *obpbcReserved;
PyObject *obriid;
obpidl = PyObject_FromPIDL(pidl, FALSE);
obpbcReserved = PyCom_PyObjectFromIUnknown(pbcReserved, IID_IBindCtx, TRUE);
obriid = PyWinObject_FromIID(riid);
PyObject *result;
HRESULT hr=InvokeViaPolicy("BindToObject", &result, "OOO", obpidl, obpbcReserved, obriid);
Py_XDECREF(obpidl);
Py_XDECREF(obpbcReserved);
Py_XDECREF(obriid);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
PyObject *obout;
if (!PyArg_Parse(result, "O" , &obout)) return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obout, IID_IUnknown, (void **)&out, FALSE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::BindToStorage(
/* [unique][in] */ LPCITEMIDLIST pidl,
/* [unique][in] */ LPBC pbcReserved,
/* [unique][in] */ REFIID riid,
/* [out] */ void **ppRet)
{
PY_GATEWAY_METHOD;
PyObject *obpidl;
PyObject *obpbcReserved;
PyObject *obriid;
obpidl = PyObject_FromPIDL(pidl, FALSE);
obpbcReserved = PyCom_PyObjectFromIUnknown(pbcReserved, IID_IBindCtx, TRUE);
obriid = PyWinObject_FromIID(riid);
PyObject *result;
HRESULT hr=InvokeViaPolicy("BindToStorage", &result, "OOO", obpidl, obpbcReserved, obriid);
Py_XDECREF(obpidl);
Py_XDECREF(obpbcReserved);
Py_XDECREF(obriid);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
PyObject *obout;
if (!PyArg_Parse(result, "O" , &obout)) return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obout, riid, ppRet, FALSE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::CompareIDs(
/* [unique][in] */ long lparam,
/* [unique][in] */ const ITEMIDLIST __RPC_FAR * pidl1,
/* [unique][in] */ const ITEMIDLIST __RPC_FAR * pidl2)
{
PY_GATEWAY_METHOD;
PyObject *obpidl1;
PyObject *obpidl2;
obpidl1 = PyObject_FromPIDL(pidl1, FALSE);
obpidl2 = PyObject_FromPIDL(pidl2, FALSE);
HRESULT hr=InvokeViaPolicy("CompareIDs", NULL, "lOO", lparam, obpidl1, obpidl2);
Py_XDECREF(obpidl1);
Py_XDECREF(obpidl2);
return hr;
}
STDMETHODIMP PyGShellFolder::CreateViewObject(
/* [unique][in] */ HWND hwndOwner,
/* [unique][in] */ REFIID riid,
/* [out] */ void **ppRet)
{
PY_GATEWAY_METHOD;
PyObject *obriid;
obriid = PyWinObject_FromIID(riid);
PyObject *result;
HRESULT hr=InvokeViaPolicy("CreateViewObject", &result, "lO", hwndOwner, obriid);
Py_XDECREF(obriid);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
PyObject *obout;
if (!PyArg_Parse(result, "O" , &obout)) return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obout, riid, ppRet, FALSE /* bNoneOK */))
bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::GetAttributesOf(
/* [unique][in] */ UINT cidl,
/* [unique][in] */ LPCITEMIDLIST *apidl,
/* [unique][in][out] */ ULONG __RPC_FAR * rgfInOut)
{
PY_GATEWAY_METHOD;
PyObject *obpidl;
obpidl = PyObject_FromPIDLArray(cidl, apidl);
PyObject *result;
HRESULT hr=InvokeViaPolicy("GetAttributesOf", &result, "Ol", obpidl, rgfInOut);
Py_XDECREF(obpidl);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
if (!PyArg_Parse(result, "l" , rgfInOut)) return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::GetUIObjectOf(
/* [unique][in] */ HWND hwndOwner,
/* [unique][in] */ UINT cidl,
/* [unique][in] */ LPCITEMIDLIST *apidl,
/* [unique][in] */ REFIID riid,
/* [unique][in][out] */ UINT * rgfInOut,
/* [out] */ void ** ppRet)
{
PY_GATEWAY_METHOD;
PyObject *obpidl;
PyObject *obriid;
obpidl = PyObject_FromPIDLArray(cidl, apidl);
obriid = PyWinObject_FromIID(riid);
PyObject *result;
HRESULT hr=InvokeViaPolicy("GetUIObjectOf", &result, "lOOl", hwndOwner, obpidl, obriid, rgfInOut);
Py_XDECREF(obpidl);
Py_XDECREF(obriid);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
PyObject *obout;
if (!PyArg_ParseTuple(result, "lO" , rgfInOut, &obout)) return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
BOOL bPythonIsHappy = TRUE;
if (bPythonIsHappy && !PyCom_InterfaceFromPyInstanceOrObject(obout, IID_IUnknown, ppRet, FALSE/* bNoneOK */))
bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::GetDisplayNameOf(
/* [unique][in] */ const ITEMIDLIST __RPC_FAR * pidl,
/* [unique][in] */ DWORD uFlags,
/* [out] */ STRRET __RPC_FAR * out)
{
PY_GATEWAY_METHOD;
PyObject *obpidl;
obpidl = PyObject_FromPIDL(pidl, FALSE);
PyObject *result;
HRESULT hr=InvokeViaPolicy("GetDisplayNameOf", &result, "Ol", obpidl, uFlags);
Py_XDECREF(obpidl);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
// *** The output argument out of type "STRRET __RPC_FAR *" was not processed ***
// The type 'STRRET' (out) is unknown.
Py_DECREF(result);
return hr;
}
STDMETHODIMP PyGShellFolder::SetNameOf(
/* [in] */ HWND hwnd,
/* [in] */ LPCITEMIDLIST pidl,
/* [string][in] */ LPCOLESTR pszName,
/* [in] */ SHGDNF uFlags,
/* [out] */ LPITEMIDLIST *ppidlOut)
{
PY_GATEWAY_METHOD;
PyObject *obpidl;
PyObject *oblpszName;
obpidl = PyObject_FromPIDL(pidl, FALSE);
oblpszName = MakeOLECHARToObj(pszName);
PyObject *result;
HRESULT hr=InvokeViaPolicy("SetNameOf", &result, "lOOl", hwnd, obpidl, oblpszName, uFlags);
Py_XDECREF(obpidl);
Py_XDECREF(oblpszName);
PyObject_AsPIDL(result, ppidlOut, FALSE);
return PyCom_HandlePythonFailureToCOM(/*pexcepinfo*/);
}
--- NEW FILE: PyIShellFolder.h ---
// This file declares the IShellFolder Interface and Gateway for Python.
// Generated by makegw.py
// ---------------------------------------------------
//
// Interface Declaration
class PyIShellFolder : public PyIUnknown
{
public:
MAKE_PYCOM_CTOR(PyIShellFolder);
static IShellFolder *GetI(PyObject *self);
static PyComTypeObject type;
// The Python methods
static PyObject *ParseDisplayName(PyObject *self, PyObject *args);
static PyObject *EnumObjects(PyObject *self, PyObject *args);
static PyObject *BindToObject(PyObject *self, PyObject *args);
static PyObject *BindToStorage(PyObject *self, PyObject *args);
static PyObject *CompareIDs(PyObject *self, PyObject *args);
static PyObject *CreateViewObject(PyObject *self, PyObject *args);
static PyObject *GetAttributesOf(PyObject *self, PyObject *args);
static PyObject *GetUIObjectOf(PyObject *self, PyObject *args);
static PyObject *GetDisplayNameOf(PyObject *self, PyObject *args);
static PyObject *SetNameOf(PyObject *self, PyObject *args);
protected:
PyIShellFolder(IUnknown *pdisp);
~PyIShellFolder();
};
// ---------------------------------------------------
//
// Gateway Declaration
class PyGShellFolder : public PyGatewayBase, public IShellFolder
{
protected:
PyGShellFolder(PyObject *instance) : PyGatewayBase(instance) { ; }
PYGATEWAY_MAKE_SUPPORT2(PyGShellFolder, IShellFolder, IID_IShellFolder, PyGatewayBase)
// IShellFolder
STDMETHOD(ParseDisplayName)(
HWND hwndOwner,
LPBC pbcReserved,
LPOLESTR lpszDisplayName,
ULONG * pchEaten,
LPITEMIDLIST *ppidl,
ULONG __RPC_FAR * pdwAttributes);
STDMETHOD(EnumObjects)(
HWND hwndOwner,
DWORD grfFlags,
IEnumIDList __RPC_FAR ** ppeidl);
STDMETHOD(BindToObject)(
LPCITEMIDLIST pidl,
LPBC pbcReserved,
REFIID riid,
void ** out);
STDMETHOD(BindToStorage)(
LPCITEMIDLIST pidl,
LPBC pbcReserved,
REFIID riid,
void **out);
STDMETHOD(CompareIDs)(
long lparam,
const ITEMIDLIST __RPC_FAR * pidl1,
const ITEMIDLIST __RPC_FAR * pidl2);
STDMETHOD(CreateViewObject)(
HWND hwndOwner,
REFIID riid,
void ** out);
STDMETHOD(GetAttributesOf)(
UINT cidl,
LPCITEMIDLIST *apidl,
ULONG __RPC_FAR * rgfInOut);
STDMETHOD(GetUIObjectOf)(
HWND hwndOwner,
UINT cidl,
LPCITEMIDLIST *apidl,
REFIID riid,
UINT *rgfReserved,
void ** out);
STDMETHOD(GetDisplayNameOf)(
const ITEMIDLIST __RPC_FAR * pidl,
DWORD uFlags,
STRRET __RPC_FAR * out);
STDMETHOD(SetNameOf)(
HWND hwnd,
LPCITEMIDLIST pidl,
LPCOLESTR pszName,
SHGDNF uFlags,
LPITEMIDLIST *ppidlOut);
};
Index: PyIShellLink.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/win32comext/shell/src/PyIShellLink.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** PyIShellLink.cpp 18 Dec 1999 08:48:45 -0000 1.3
--- PyIShellLink.cpp 6 Oct 2003 12:47:57 -0000 1.4
***************
*** 5,11 ****
#include "PyIShellLink.h"
- extern BOOL PyObject_AsPIDL(PyObject *ob, LPCITEMIDLIST *ppidl, BOOL bNoneOK = FALSE);
- extern PyObject *PyObject_FromPIDL(LPITEMIDLIST pidl);
- void PyObject_FreePIDL( LPCITEMIDLIST pidl );
PyObject *PyObject_FromWIN32_FIND_DATA(WIN32_FIND_DATAA &findData);
--- 5,8 ----
***************
*** 86,90 ****
if ( FAILED(hr) )
return OleSetOleError(hr);
! return PyObject_FromPIDL(pidl);
}
--- 83,87 ----
if ( FAILED(hr) )
return OleSetOleError(hr);
! return PyObject_FromPIDL(pidl, TRUE);
}
***************
*** 95,99 ****
if ( pISL == NULL )
return NULL;
! LPCITEMIDLIST pidl;
PyObject *obpidl;
if ( !PyArg_ParseTuple(args, "O:SetIDList", &obpidl) )
--- 92,96 ----
if ( pISL == NULL )
return NULL;
! LPITEMIDLIST pidl;
PyObject *obpidl;
if ( !PyArg_ParseTuple(args, "O:SetIDList", &obpidl) )
Index: shell.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/win32comext/shell/src/shell.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** shell.cpp 28 Jun 2002 02:24:56 -0000 1.5
--- shell.cpp 6 Oct 2003 12:47:57 -0000 1.6
***************
*** 15,18 ****
--- 15,23 ----
#include "shell_pch.h"
#include "PyIShellLink.h"
+ #include "PyIContextMenu.h"
+ #include "PyIExtractIcon.h"
+ #include "PyIShellExtInit.h"
+ #include "PyIShellFolder.h"
+ #include "PyIEnumIDList.h"
#include "PythonCOMRegister.h" // For simpler registration of IIDs etc.
***************
*** 20,24 ****
{
IMalloc *pMalloc;
! if (SHGetMalloc(&pMalloc)==S_OK) {
pMalloc->Free(p);
pMalloc->Release();
--- 25,29 ----
{
IMalloc *pMalloc;
! if (p && SHGetMalloc(&pMalloc)==S_OK) {
pMalloc->Free(p);
pMalloc->Release();
***************
*** 56,65 ****
}
! PyObject *PyObject_FromPIDL(LPITEMIDLIST pidl)
{
! return PyString_FromStringAndSize((char *)pidl, PyShell_ILGetSize(pidl) );
}
// @object PyIDL|A Python representation of an IDL. Implemented as a Python string.
! BOOL PyObject_AsPIDL(PyObject *ob, LPCITEMIDLIST *ppidl, BOOL bNoneOK = FALSE)
{
if (ob==Py_None) {
--- 61,73 ----
}
! PyObject *PyObject_FromPIDL(LPCITEMIDLIST pidl, BOOL bFreeSystemPIDL)
{
! PyObject *ret = PyString_FromStringAndSize((char *)pidl, PyShell_ILGetSize(pidl) );
! if (bFreeSystemPIDL)
! PyShell_FreeMem( (void *)pidl);
! return ret;
}
// @object PyIDL|A Python representation of an IDL. Implemented as a Python string.
! BOOL PyObject_AsPIDL(PyObject *ob, ITEMIDLIST **ppidl, BOOL bNoneOK /*= FALSE*/)
{
if (ob==Py_None) {
***************
*** 82,86 ****
}
memcpy( buf, PyString_AsString(ob), cb);
! *ppidl = (LPCITEMIDLIST)buf;
return TRUE;
}
--- 90,94 ----
}
memcpy( buf, PyString_AsString(ob), cb);
! *ppidl = (LPITEMIDLIST)buf;
return TRUE;
}
***************
*** 90,93 ****
--- 98,255 ----
}
+ BOOL PyObject_AsPIDLArray(PyObject *obSeq, UINT *pcidl, LPCITEMIDLIST **ret)
+ {
+ // string is a seq - handle that
+ *pcidl = 0;
+ *ret = NULL;
+ if (PyString_Check(obSeq) || !PySequence_Check(obSeq)) {
+ PyErr_SetString(PyExc_TypeError, "Must be an array of IDLs");
+ return FALSE;
+ }
+ int n = PySequence_Length(obSeq);
+ LPCITEMIDLIST *ppidl = (LPCITEMIDLIST *)malloc(n * sizeof(ITEMIDLIST *));
+ if (!ppidl) {
+ PyErr_NoMemory();
+ return FALSE;
+ }
+ for (int i=0;i<n;i++) {
+ PyObject *ob = PySequence_GetItem(obSeq, i);
+ if (!ob || !PyObject_AsPIDL(ob, (ITEMIDLIST **)&ppidl[i], FALSE )) {
+ Py_XDECREF(ob);
+ PyObject_FreePIDLArray(n, ppidl);
+ return FALSE;
+ }
+ Py_DECREF(ob);
+ }
+ *pcidl = n;
+ *ret = ppidl;
+ return TRUE;
+ }
+
+ void PyObject_FreePIDLArray(UINT cidl, LPCITEMIDLIST *pidl)
+ {
+ for (UINT i=0;i<cidl;i++)
+ if (pidl[i])
+ PyObject_FreePIDL(pidl[i]);
+ free(pidl);
+ }
+
+ PyObject *PyObject_FromPIDLArray(UINT cidl, LPCITEMIDLIST *pidl)
+ {
+ PyObject *ob = PyList_New(cidl);
+ if (!ob) return NULL;
+ for (UINT i=0;i<cidl;i++) {
+ PyObject *n = PyObject_FromPIDL(pidl[i], FALSE);
+ if (!n) {
+ Py_DECREF(ob);
+ return NULL;
+ }
+ PyList_SET_ITEM(ob, i, n); // consumes ref to 'n'
+ }
+ return ob;
+ }
+
+
+ PyObject *PyWinObject_FromRESOURCESTRING(LPCSTR str)
+ {
+ if (!str) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ if (HIWORD(str)==0)
+ return PyInt_FromLong(LOWORD(str));
+ return PyString_FromString(str);
+ }
+
+ BOOL PyObject_AsCMINVOKECOMMANDINFO(PyObject *ob, CMINVOKECOMMANDINFO **ppci)
+ {
+ *ppci = NULL;
+ PyErr_SetString(PyExc_NotImplementedError, "CMINVOKECOMMANDINFO not yet supported");
+ return FALSE;
+ }
+ void PyObject_FreeCMINVOKECOMMANDINFO( CMINVOKECOMMANDINFO *pci )
+ {
+ if (pci)
+ free(pci);
+ }
+ static PyObject *PyString_FromMaybeNullString(const char *sz)
+ {
+ if (sz)
+ return PyString_FromString(sz);
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+
+ PyObject *PyObject_FromCMINVOKECOMMANDINFO(const CMINVOKECOMMANDINFO *pci)
+ {
+ if (!pci) {
+ Py_INCREF(Py_None);
+ return Py_None;
+ }
+ PyObject *obVerb = PyWinObject_FromRESOURCESTRING(pci->lpVerb);
+ if (!obVerb) return NULL;
+ PyObject *obParams = PyString_FromMaybeNullString(pci->lpParameters);
+ if (!obParams) {
+ Py_DECREF(obVerb);
+ return NULL;
+ }
+ PyObject *obDir = PyString_FromMaybeNullString(pci->lpDirectory);
+ if (!obDir) {
+ Py_DECREF(obVerb);
+ Py_DECREF(obParams);
+ return NULL;
+ }
+ return Py_BuildValue("iiNNNiii", pci->fMask, pci->hwnd,
+ obVerb, obParams, obDir,
+ pci->nShow, pci->dwHotKey, pci->hIcon);
+ }
+
+ BOOL PyObject_AsSTRRET( PyObject *ob, STRRET &out )
+ {
+ if (PyInt_Check(ob)) {
+ out.uType = STRRET_OFFSET;
+ out.uOffset = PyInt_AsLong(ob);
+ return TRUE;
+ }
+ if (PyString_Check(ob)) {
+ out.uType = STRRET_CSTR;
+ strncpy(out.cStr, PyString_AsString(ob), MAX_PATH);
+ return TRUE;
+ }
+ PyErr_Format(PyExc_TypeError, "Can't convert objects of type '%s' to STRRET", ob->ob_type->tp_name);
+ return FALSE;
+ }
+
+ void PyObject_FreeSTRRET(STRRET &s)
+ {
+ if (s.uType==STRRET_WSTR) {
+ PyShell_FreeMem(s.pOleStr);
+ s.pOleStr = NULL;
+ }
+ }
+
+ PyObject *PyObject_FromSTRRET(STRRET *ps, ITEMIDLIST *pidl, BOOL bFree)
+ {
+ PyObject *ret;
+ switch (ps->uType) {
+ case STRRET_CSTR:
+ ret = PyString_FromString(ps->cStr);
+ break;
+ case STRRET_OFFSET:
+ ret = PyString_FromString(((char *)pidl)+ps->uOffset);
+ break;
+ case STRRET_WSTR:
+ ret = PyWinObject_FromWCHAR(ps->pOleStr);
+ break;
+ default:
+ PyErr_SetString(PyExc_RuntimeError, "unknown uType");
+ ret = NULL;
+ break;
+ }
+ if (bFree)
+ PyObject_FreeSTRRET(*ps);
+ return ret;
+ }
+
//////////////////////////////////////////////////
//
***************
*** 150,154 ****
goto done;
}
! if (!PyObject_AsPIDL(obPIDL, &bi.pidlRoot, TRUE))
goto done;
--- 312,316 ----
goto done;
}
! if (!PyObject_AsPIDL(obPIDL, (LPITEMIDLIST *)&bi.pidlRoot, TRUE))
goto done;
***************
*** 166,173 ****
// a tuple of (PIDL, DisplayName, iImageList)
if (pl){
! PyObject *obPidl = PyObject_FromPIDL(pl);
PyObject *obDisplayName = PyWinObject_FromTCHAR(bi.pszDisplayName);
rc = Py_BuildValue("OOi", obPidl, obDisplayName, bi.iImage);
- PyShell_FreeMem(pl);
Py_XDECREF(obPidl);
Py_XDECREF(obDisplayName);
--- 328,334 ----
// a tuple of (PIDL, DisplayName, iImageList)
if (pl){
! PyObject *obPidl = PyObject_FromPIDL(pl, TRUE);
PyObject *obDisplayName = PyWinObject_FromTCHAR(bi.pszDisplayName);
rc = Py_BuildValue("OOi", obPidl, obDisplayName, bi.iImage);
Py_XDECREF(obPidl);
Py_XDECREF(obDisplayName);
***************
*** 187,191 ****
char buffer[MAX_PATH];
PyObject *rc;
! LPCITEMIDLIST pidl;
PyObject *obPidl;
--- 348,352 ----
char buffer[MAX_PATH];
PyObject *rc;
! LPITEMIDLIST pidl;
PyObject *obPidl;
***************
*** 256,261 ****
if (FAILED(hr))
return OleSetOleError(hr);
! PyObject *rc = PyObject_FromPIDL(pidl);
! PyShell_FreeMem(pidl);
return rc;
}
--- 417,421 ----
if (FAILED(hr))
return OleSetOleError(hr);
! PyObject *rc = PyObject_FromPIDL(pidl, TRUE);
return rc;
}
***************
*** 339,344 ****
if (FAILED(hr))
return OleSetOleError(hr);
! PyObject *rc = PyObject_FromPIDL(pidl);
! PyShell_FreeMem(pidl);
return rc;
}
--- 499,503 ----
if (FAILED(hr))
return OleSetOleError(hr);
! PyObject *rc = PyObject_FromPIDL(pidl, TRUE);
return rc;
}
***************
*** 362,386 ****
- // @pymethod <o PyIDL>|shell|SHChangeNotify|Notifies the system of an event that an application has performed. An application should use this function if it performs an action that may affect the shell.
- static PyObject *PySHChangeNotify(PyObject *self, PyObject *args)
- {
- int flags;
- DWORD eventId;
- void *whatever1;
- void *whatever2;
- if(!PyArg_ParseTuple(args, "lizz:SHChangeNotify",
- &eventId, // @pyparm int|eventId||Describes the event that has occurred. One of the SHCNE_* constants.
- &flags, // @pyparm int|flags||Flags that indicate the meaning of the other params.
- &whatever1, // @pyparm string|whatever||A path or <o PyIDL>
- &whatever2)) // @pyparm string|whatever||A path or <o PyIDL>
- return NULL;
- // @todo This function does not support integers
- PY_INTERFACE_PRECALL;
- SHChangeNotify(eventId, flags, whatever1, whatever2);
- PY_INTERFACE_POSTCALL;
- P...
[truncated message content] |