From: <mha...@us...> - 2003-10-06 12:48:06
|
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] |