Thread: [pywin32-checkins] /hgroot/pywin32/pywin32: 5 new changesets
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: <pyw...@li...> - 2012-08-06 02:10:23
|
changeset c7cffbcd27e5 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=c7cffbcd27e5 summary: Prevent pythoncom.WrapObject() double releasing a reference now PyCom_PyObjectFromIUnknown has saner error behaviour changeset dafd0153cb25 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=dafd0153cb25 summary: Avoid temp objects when making result values, mainly in makepy generated code changeset 53d276dfdc4b in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=53d276dfdc4b summary: Ensure IEnum* interfaces release references on error changeset 3d96807807b5 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=3d96807807b5 summary: a couple more minor cleanups while reviewing PyCom_PyObjectFromIUnknown error handling change changeset 02686d59297d in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=02686d59297d summary: Use PYCOM_RELEASE() in more places diffstat: com/win32com/src/ErrorUtils.cpp | 4 +- com/win32com/src/PyComHelpers.cpp | 6 +- com/win32com/src/PyIUnknown.cpp | 6 +- com/win32com/src/PythonCOM.cpp | 61 ++++----- com/win32com/src/extensions/PyIEnumConnectionPoints.cpp | 8 +- com/win32com/src/extensions/PyIEnumConnections.cpp | 11 +- com/win32com/src/extensions/PyIMoniker.cpp | 22 +-- com/win32com/src/extensions/PyIPropertyStorage.cpp | 7 +- com/win32com/src/extensions/PyIStorage.cpp | 5 +- com/win32com/src/extensions/PyIType.cpp | 6 +- com/win32com/src/include/PythonCOM.h | 12 + com/win32com/src/oleargs.cpp | 12 +- com/win32com/src/univgw.cpp | 10 +- com/win32comext/axcontrol/src/PyIObjectWithSite.cpp | 7 +- com/win32comext/axcontrol/src/PyIOleClientSite.cpp | 14 +- com/win32comext/axcontrol/src/PyIOleInPlaceSite.cpp | 12 +- com/win32comext/axcontrol/src/PyIOleObject.cpp | 35 +---- com/win32comext/axcontrol/src/PyIViewObject.cpp | 8 +- com/win32comext/axdebug/src/PyIActiveScriptDebug.cpp | 5 +- com/win32comext/axdebug/src/PyIActiveScriptErrorDebug.cpp | 14 +- com/win32comext/axdebug/src/PyIActiveScriptSiteDebug.cpp | 19 +-- com/win32comext/axdebug/src/PyIApplicationDebugger.cpp | 7 +- com/win32comext/axdebug/src/PyIDebugApplication.cpp | 19 +-- com/win32comext/axdebug/src/PyIDebugApplicationNode.cpp | 14 +- com/win32comext/axdebug/src/PyIDebugCodeContext.cpp | 7 +- com/win32comext/axdebug/src/PyIDebugDocumentContext.cpp | 14 +- com/win32comext/axdebug/src/PyIDebugDocumentHelper.cpp | 22 +-- com/win32comext/axdebug/src/PyIDebugDocumentHost.cpp | 7 +- com/win32comext/axdebug/src/PyIDebugDocumentProvider.cpp | 5 +- com/win32comext/axdebug/src/PyIDebugDocumentText.cpp | 7 +- com/win32comext/axdebug/src/PyIDebugExpression.cpp | 6 +- com/win32comext/axdebug/src/PyIDebugExpressionContext.cpp | 7 +- com/win32comext/axdebug/src/PyIDebugProperties.cpp | 20 +-- com/win32comext/axdebug/src/PyIDebugStackFrame.cpp | 21 +-- com/win32comext/axdebug/src/PyIDebugStackFrameSniffer.cpp | 7 +- com/win32comext/axdebug/src/PyIDebugSyncOperation.cpp | 14 +- com/win32comext/axdebug/src/PyIEnumDebugApplicationNodes.cpp | 6 +- com/win32comext/axdebug/src/PyIEnumDebugCodeContexts.cpp | 6 +- com/win32comext/axdebug/src/PyIEnumDebugExpressionContexts.cpp | 6 +- com/win32comext/axdebug/src/PyIEnumDebugStackFrames.cpp | 7 +- com/win32comext/axdebug/src/PyIEnumRemoteDebugApplicationThreads.cpp | 6 +- com/win32comext/axdebug/src/PyIEnumRemoteDebugApplications.cpp | 6 +- com/win32comext/axdebug/src/PyIMachineDebugManager.cpp | 5 +- com/win32comext/axdebug/src/PyIProcessDebugManager.cpp | 14 +- com/win32comext/axdebug/src/PyIProvideExpressionContexts.cpp | 7 +- com/win32comext/axdebug/src/PyIRemoteDebugApplication.cpp | 11 +- com/win32comext/bits/src/PyIBackgroundCopyManager.cpp | 21 +-- com/win32comext/bits/src/PyIEnumBackgroundCopyFiles.cpp | 6 +- com/win32comext/bits/src/PyIEnumBackgroundCopyJobs.cpp | 6 +- com/win32comext/shell/src/PyIEnumExplorerCommand.cpp | 6 +- com/win32comext/shell/src/PyIShellView.cpp | 6 +- com/win32comext/shell/src/shell.cpp | 49 +------ com/win32comext/taskscheduler/src/PyITaskScheduler.cpp | 8 +- 53 files changed, 150 insertions(+), 487 deletions(-) diffs (truncated from 1571 to 300 lines): diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/ErrorUtils.cpp --- a/com/win32com/src/ErrorUtils.cpp Sat Aug 04 20:35:38 2012 -0400 +++ b/com/win32com/src/ErrorUtils.cpp Mon Aug 06 12:04:10 2012 +1000 @@ -596,9 +596,7 @@ Py_END_ALLOW_THREADS if (hr==S_OK) { obEI = PyCom_PyObjectFromIErrorInfo(pEI, errorhr); - Py_BEGIN_ALLOW_THREADS - pEI->Release(); - Py_END_ALLOW_THREADS + PYCOM_RELEASE(pEI); } } } diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/PyComHelpers.cpp --- a/com/win32com/src/PyComHelpers.cpp Sat Aug 04 20:35:38 2012 -0400 +++ b/com/win32com/src/PyComHelpers.cpp Mon Aug 06 12:04:10 2012 +1000 @@ -104,11 +104,7 @@ // caller is asking us to take ownership of the COM reference. If we // fail to create a Python object, we must release the reference. #define POFIU_RELEASE_ON_FAILURE \ - if (!bAddRef) { \ - PY_INTERFACE_PRECALL; \ - punk->Release(); \ - PY_INTERFACE_POSTCALL; \ - } + if (!bAddRef) PYCOM_RELEASE(punk) // Interface conversions diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/PyIUnknown.cpp --- a/com/win32com/src/PyIUnknown.cpp Sat Aug 04 20:35:38 2012 -0400 +++ b/com/win32com/src/PyIUnknown.cpp Mon Aug 06 12:04:10 2012 +1000 @@ -245,11 +245,7 @@ PyErr_Clear(); rc = PyCom_PyObjectFromIUnknown(punk, useIID, TRUE); } - { - PY_INTERFACE_PRECALL; - punk->Release(); - PY_INTERFACE_POSTCALL; - } + PYCOM_RELEASE(punk); return rc; } diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/PythonCOM.cpp --- a/com/win32com/src/PythonCOM.cpp Sat Aug 04 20:35:38 2012 -0400 +++ b/com/win32com/src/PythonCOM.cpp Mon Aug 06 12:04:10 2012 +1000 @@ -269,6 +269,12 @@ PyObject *obNew; if (mqi[i].hr==0) obNew = PyCom_PyObjectFromIUnknown(mqi[i].pItf, *mqi[i].pIID, FALSE); + mqi[i].pItf = NULL; + if (!obNew) { + Py_DECREF(result); + result = NULL; + goto done; + } else { obNew = Py_None; Py_INCREF(Py_None); @@ -276,14 +282,11 @@ PyTuple_SET_ITEM(result, i, obNew); } done: - if (punk) { - PY_INTERFACE_PRECALL; - punk->Release(); - PY_INTERFACE_POSTCALL; - } + PYCOM_RELEASE(punk); if (serverInfo.pwszName) PyWinObject_FreeWCHAR(serverInfo.pwszName); + for (i=0;i<numIIDs;i++) PYCOM_RELEASE(mqi[i].pItf) delete [] iids; delete [] mqi; return result; @@ -734,19 +737,8 @@ PY_INTERFACE_POSTCALL; if ( FAILED(hr) ) return PyCom_BuildPyException(hr); - - /* pass the pDispatch reference into this thing */ - /* ### this guy should always AddRef() ... */ - PyObject *result = PyCom_PyObjectFromIUnknown(pDispatch, iidInterface, FALSE); - if ( !result ) - { - PY_INTERFACE_PRECALL; - pDispatch->Release(); - PY_INTERFACE_POSTCALL; - return NULL; - } - - return result; + /* return a PyObject wrapping it */ + return PyCom_PyObjectFromIUnknown(pDispatch, iidInterface, FALSE); } static PyObject *pythoncom_MakeIID(PyObject *self, PyObject *args) @@ -794,7 +786,10 @@ } /* pass the pBC ref into obBindCtx */ - obBindCtx = PyCom_PyObjectFromIUnknown(pBC, IID_IBindCtx, FALSE); + if (!(obBindCtx = PyCom_PyObjectFromIUnknown(pBC, IID_IBindCtx, FALSE))) { + PyWinObject_FreeWCHAR(displayName); + return NULL; + } } else { @@ -807,7 +802,10 @@ Py_INCREF(obBindCtx); pBC->Release(); } - /* at this point: we own a ref to obBindCtx, but not pBC */ + /* at this point: we own a ref to obBindCtx, but not a direct one on pBC + (obBindCtx itself has an indirect reference to pBC though, so it is still + safe to use ...) + */ ULONG chEaten; IMoniker *pmk; PY_INTERFACE_PRECALL; @@ -819,18 +817,11 @@ Py_DECREF(obBindCtx); return PyCom_BuildPyException(hr); } - - /* pass ownership of the moniker into the result */ - PyObject *obMoniker = PyCom_PyObjectFromIUnknown(pmk, IID_IMoniker, FALSE); - /* build the result */ - PyObject *result = Py_BuildValue("OiO", obMoniker, chEaten, obBindCtx); - - /* done with these obs */ - Py_XDECREF(obMoniker); - Py_DECREF(obBindCtx); - - return result; + return Py_BuildValue("NiN", + PyCom_PyObjectFromIUnknown(pmk, IID_IMoniker, FALSE), + chEaten, + obBindCtx); } // @pymethod <o PyIMoniker>|pythoncom|CreatePointerMoniker|Creates a new <o PyIMoniker> object. @@ -942,7 +933,7 @@ PyCom_BuildPyException(hr); else ret=PyCom_PyObjectFromIUnknown(output_moniker, IID_IMoniker, FALSE); - } + } PyWinObject_FreeWCHAR(url); return ret; } @@ -1259,7 +1250,7 @@ PyCom_BuildPyException(hr); else ret=PyCom_PyObjectFromIUnknown(pIUnknown, riid, FALSE); - } + } return ret; } @@ -1402,9 +1393,7 @@ IStream *pStream; if (!PyCom_InterfaceFromPyObject(obStream, IID_IStream, (void **)&pStream, FALSE)) { - PY_INTERFACE_PRECALL; - if(pPersist) pPersist->Release(); - PY_INTERFACE_POSTCALL; + PYCOM_RELEASE(pPersist); return NULL; } diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/extensions/PyIEnumConnectionPoints.cpp --- a/com/win32com/src/extensions/PyIEnumConnectionPoints.cpp Sat Aug 04 20:35:38 2012 -0400 +++ b/com/win32com/src/extensions/PyIEnumConnectionPoints.cpp Mon Aug 06 12:04:10 2012 +1000 @@ -58,13 +58,12 @@ } PyObject *result = PyTuple_New(celtFetched); - if ( result != NULL ) - { + if (result) { for ( i = celtFetched; i--; ) { PyObject *ob = PyCom_PyObjectFromIUnknown(rgVar[i], IID_IConnectionPoint, FALSE); - if ( ob == NULL ) - { + rgVar[i] = NULL; + if ( ob == NULL ) { Py_DECREF(result); result = NULL; break; @@ -72,6 +71,7 @@ PyTuple_SET_ITEM(result, i, ob); } } + for ( i = celtFetched; i--; ) PYCOM_RELEASE(rgVar[i]); delete [] rgVar; return result; } diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/extensions/PyIEnumConnections.cpp --- a/com/win32com/src/extensions/PyIEnumConnections.cpp Sat Aug 04 20:35:38 2012 -0400 +++ b/com/win32com/src/extensions/PyIEnumConnections.cpp Mon Aug 06 12:04:10 2012 +1000 @@ -56,21 +56,20 @@ } PyObject *result = PyTuple_New(celtFetched); - if ( result != NULL ) - { + if (result) { for ( i = celtFetched; i--; ) { PyObject *ob = PyCom_PyObjectFromIUnknown(rgVar[i].pUnk, IID_IUnknown, FALSE); - if ( ob == NULL ) - { + rgVar[i].pUnk = NULL; + if ( ob == NULL ) { Py_DECREF(result); result = NULL; break; } - PyTuple_SET_ITEM(result, i, Py_BuildValue("Ol",ob, rgVar[i].dwCookie)); - Py_DECREF(ob); + PyTuple_SET_ITEM(result, i, Py_BuildValue("Nl",ob, rgVar[i].dwCookie)); } } + for ( i = celtFetched; i--; ) PYCOM_RELEASE(rgVar[i].pUnk); delete [] rgVar; return result; } diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/extensions/PyIMoniker.cpp --- a/com/win32com/src/extensions/PyIMoniker.cpp Sat Aug 04 20:35:38 2012 -0400 +++ b/com/win32com/src/extensions/PyIMoniker.cpp Mon Aug 06 12:04:10 2012 +1000 @@ -53,13 +53,12 @@ } PyObject *result = PyTuple_New(celtFetched); - if ( result != NULL ) - { + if (result) { for ( i = celtFetched; i--; ) { PyObject *ob = PyCom_PyObjectFromIUnknown(rgVar[i], IID_IMoniker, FALSE); - if ( ob == NULL ) - { + rgVar[i] = NULL; + if ( ob == NULL ) { Py_DECREF(result); result = NULL; break; @@ -67,6 +66,7 @@ PyTuple_SET_ITEM(result, i, ob); } } + for ( i = celtFetched; i--; ) PYCOM_RELEASE(rgVar[i]); delete [] rgVar; return result; // @rdesc The result is a tuple of <o PyIID> objects, @@ -183,10 +183,7 @@ IMoniker *pMonLeft = NULL; if (obMoniker!=Py_None) { if (!PyCom_InterfaceFromPyInstanceOrObject(obMoniker, IID_IMoniker, (void **)&pMonLeft, FALSE)) { - PY_INTERFACE_PRECALL; - pBindCtx->Release(); - PY_INTERFACE_POSTCALL; - + PYCOM_RELEASE(pBindCtx); return NULL; } } @@ -234,10 +231,7 @@ IMoniker *pMonLeft = NULL; if (obMoniker!=Py_None) { if (!PyCom_InterfaceFromPyInstanceOrObject(obMoniker, IID_IMoniker, (void **)&pMonLeft, FALSE)) { - PY_INTERFACE_PRECALL; - pBindCtx->Release(); - PY_INTERFACE_POSTCALL; - + PYCOM_RELEASE(pBindCtx); return NULL; } } @@ -284,9 +278,7 @@ IMoniker *pMonLeft = NULL; if (obMoniker!=Py_None) { if (!PyCom_InterfaceFromPyInstanceOrObject(obMoniker, IID_IMoniker, (void **)&pMonLeft, FALSE)) { - PY_INTERFACE_PRECALL; - pBindCtx->Release(); - PY_INTERFACE_POSTCALL; + PYCOM_RELEASE(pBindCtx); return NULL; } } diff -r eb5c1ebf9472 -r 02686d59297d com/win32com/src/extensions/PyIPropertyStorage.cpp --- a/com/win32com/src/extensions/PyIPropertyStorage.cpp Sat Aug 04 20:35:38 2012 -0400 |
From: <pyw...@li...> - 2015-08-24 09:05:56
|
changeset 055bbedd423c in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=055bbedd423c summary: py3 fixes for mapi.OpenStreamOnFile changeset f04eba3e2adb in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=f04eba3e2adb summary: Add mapi.HrGetOneProp and mapi.HrSetOneProp changeset 508bd990fe01 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=508bd990fe01 summary: Add PyIMAPIFolder::DeleteFolder() changeset 79f05b2f4a2e in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=79f05b2f4a2e summary: Issue 148: add typemap for ULONG_PTR changeset 835a071ad7bf in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=835a071ad7bf summary: Issue 139 - reload comes from the imp module on py3k diffstat: SWIG/swig_lib/python/pywintypes.i | 43 +++++++++ com/win32com/client/gencache.py | 4 + com/win32comext/mapi/src/PyIMAPIFolder.i | 47 ++++++++++ com/win32comext/mapi/src/mapi.i | 138 +++++++++++++++++++++++++++++- win32/src/PyUnicode.cpp | 5 +- 5 files changed, 228 insertions(+), 9 deletions(-) diffs (truncated from 320 to 300 lines): diff -r 575a76a7789b -r 835a071ad7bf SWIG/swig_lib/python/pywintypes.i --- a/SWIG/swig_lib/python/pywintypes.i Wed May 20 17:31:53 2015 +1000 +++ b/SWIG/swig_lib/python/pywintypes.i Mon Aug 24 18:56:44 2015 +1000 @@ -480,6 +480,49 @@ } } +//-------------------------------------------------------------------------- +// +// ULONG_PTR +// +//-------------------------------------------------------------------------- +%typemap(python, in) ULONG_PTR +{ + if (!PyWinLong_AsULONG_PTR($source, &$target)) + return NULL; +} +%typemap(python, in) ULONG_PTR * (ULONG_PTR temp) +{ + $target = &temp; + if (!PyWinLong_AsULONG_PTR($source, $target)) + return NULL; +} +%typemap(python, ignore) ULONG_PTR *OUTPUT(ULONG_PTR temp) +{ + $target = &temp; +} +%typemap(python, out) ULONG_PTR +{ + $target = PyWinObject_FromULONG_PTR($source) +} +%typemap(python,argout) ULONG_PTR *OUTPUT { + PyObject *o; + o = PyWinObject_FromULONG_PTR(*$source); + if (!$target) { + $target = o; + } else if ($target == Py_None) { + Py_DECREF(Py_None); + $target = o; + } else { + if (!PyList_Check($target)) { + PyObject *o2 = $target; + $target = PyList_New(0); + PyList_Append($target,o2); + Py_XDECREF(o2); + } + PyList_Append($target,o); + Py_XDECREF(o); + } +} //--------------------------------------------------------------------------- // diff -r 575a76a7789b -r 835a071ad7bf com/win32com/client/gencache.py --- a/com/win32com/client/gencache.py Wed May 20 17:31:53 2015 +1000 +++ b/com/win32com/client/gencache.py Mon Aug 24 18:56:44 2015 +1000 @@ -27,6 +27,10 @@ import traceback import CLSIDToClass import operator +try: + from imp import reload # exported by the imp module in py3k. +except: + pass # a builtin on py2k. bForDemandDefault = 0 # Default value of bForDemand - toggle this to change the world - see also makepy.py diff -r 575a76a7789b -r 835a071ad7bf com/win32comext/mapi/src/PyIMAPIFolder.i --- a/com/win32comext/mapi/src/PyIMAPIFolder.i Wed May 20 17:31:53 2015 +1000 +++ b/com/win32comext/mapi/src/PyIMAPIFolder.i Mon Aug 24 18:56:44 2015 +1000 @@ -64,6 +64,53 @@ // @flag MESSAGE_DIALOG |Displays a progress indicator as the operation proceeds. // @flag MESSAGE_MOVE|The message or messages are to be moved rather than copied. If MESSAGE_MOVE is not set, the messages are copied. +// @pyswig |DeleteFolder|Deletes a subfolder. +%native(DeleteFolder) DeleteFolder; +%{ +PyObject *PyIMAPIFolder::DeleteFolder(PyObject *self, PyObject *args) +{ + HRESULT hRes; + PyObject *obEntryId, *obUIParam, *obProgress; + ULONG cbEID; + LPENTRYID eid; + ULONG_PTR ulUIParam; + LPMAPIPROGRESS lpProgress; + ULONG flags = 0; + + IMAPIFolder *_swig_self; + if ((_swig_self=GetI(self))==NULL) return NULL; + + if(!PyArg_ParseTuple(args,"OOO|l:DeleteFolder", + &obEntryId, // @pyparm string|entryId||The EntryID of the subfolder to delete. + &obUIParam, // @pyparm long|uiParam||Handle of the parent window of the progress indicator. + &obProgress, // @pyparm <o PyIMAPIProgress>|progress||A progress object, or None + &flags)) + return NULL; + if PyString_Check(obEntryId) { + eid = (LPENTRYID)PyString_AsString(obEntryId); + cbEID = PyString_Size(obEntryId); + } else { + PyErr_SetString(PyExc_TypeError, "EntryID must be a string"); + return NULL; + } + if (!PyWinLong_AsULONG_PTR(obUIParam, &ulUIParam)) + return NULL; + if (!PyCom_InterfaceFromPyInstanceOrObject(obProgress, IID_IMAPIProgress, (void **)&lpProgress, TRUE)) + return NULL; + + PY_INTERFACE_PRECALL; + hRes = (HRESULT)_swig_self->DeleteFolder(cbEID, eid, ulUIParam, lpProgress, flags); + PY_INTERFACE_POSTCALL; + + if (lpProgress) + lpProgress->Release(); + + if (FAILED(hRes)) + return OleSetOleError(hRes); + + return Py_BuildValue("i", hRes); +} +%} // @pyswig |DeleteMessages|Deletes the specified messages. HRESULT DeleteMessages( diff -r 575a76a7789b -r 835a071ad7bf com/win32comext/mapi/src/mapi.i --- a/com/win32comext/mapi/src/mapi.i Wed May 20 17:31:53 2015 +1000 +++ b/com/win32comext/mapi/src/mapi.i Mon Aug 24 18:56:44 2015 +1000 @@ -241,6 +241,13 @@ #define RTF_SYNC_BODY_CHANGED RTF_SYNC_BODY_CHANGED // The plain text version of the message has changed. #define RTF_SYNC_RTF_CHANGED RTF_SYNC_RTF_CHANGED // The RTF version of the message has changed. +#define DEL_FOLDERS DEL_FOLDERS // All subfolders of the subfolder pointed to by lpEntryID should be deleted. +#define DEL_MESSAGES DEL_MESSAGES // All messages in the subfolder pointed to by lpEntryID should be deleted. +#define FOLDER_DIALOG FOLDER_DIALOG // A progress indicator should be displayed while the operation proceeds. +#define MESSAGE_DIALOG MESSAGE_DIALOG // Displays a progress indicator as the operation proceeds. +#define SHOW_SOFT_DELETES ((ULONG) 0x00000002) // Shows items that are currently marked as soft deleted. +#define DELETE_HARD_DELETE ((ULONG) 0x00000010) // Permanently removes all messages, including soft-deleted ones. + #define MAPI_CREATE MAPI_CREATE // The object will be created if necessary. #define MAPI_E_CALL_FAILED MAPI_E_CALL_FAILED #define MAPI_E_NOT_ENOUGH_MEMORY MAPI_E_NOT_ENOUGH_MEMORY @@ -468,6 +475,9 @@ #define CCSF_EMBEDDED_MESSAGE CCSF_EMBEDDED_MESSAGE // sent/unsent information is persisted in X-Unsent #define CCSF_PRESERVE_SOURCE CCSF_PRESERVE_SOURCE // don't modify the source message +// StreamOnFile (SOF) +#define SOF_UNIQUEFILENAME SOF_UNIQUEFILENAME // A temporary file is to be created for the IStream object + // @object MAPIINIT_0|A MAPIINIT_0 is represented as a tuple of: // @tupleitem 0|int|version|This must be MAPI_INIT_VERSION. // @tupleitem 1|int|flags|MAPI initlization flags. @@ -795,32 +805,144 @@ %} %native(RTFStreamToHTML) MyRTFStreamToHTML; - +// @pyswig <o PyIStream>|OpenStreamOnFile|Allocates and initializes an OLE IStream object to access the contents of a file. +%native(OpenStreamOnFile) PyOpenStreamOnFile; %{ PyObject *PyOpenStreamOnFile(PyObject *self, PyObject *args) { HRESULT hRes; unsigned long flags = 0; IStream *pStream; - PyObject *obFilepath; + PyObject *obFileName; + char *filename = NULL; + PyObject *obPrefix = Py_None; + char *prefix = NULL; - if (!PyArg_ParseTuple(args, "O|l:OpenStreamOnFile", &obFilepath, &flags)) + if (!PyArg_ParseTuple(args, "O|lO:OpenStreamOnFile", + &obFileName, // @pyparm string|filename|| + &flags, // @pyparm int|flags|0| + &obPrefix)) // @pyparm string|prefix|None| return NULL; - TCHAR *filepath; - if (!PyWinObject_AsTCHAR(obFilepath, &filepath, FALSE)) - return NULL; + if (!PyWinObject_AsString(obFileName, &filename, TRUE)) + goto done; + + if (!PyWinObject_AsString(obPrefix, &prefix, TRUE)) + goto done; PY_INTERFACE_PRECALL; - hRes = OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer, flags, filepath, NULL, &pStream); + // mapiutil.h incorrectly declares OpenStreamOnFile taking type LPTSTR + hRes = OpenStreamOnFile(MAPIAllocateBuffer, MAPIFreeBuffer, flags, (LPTSTR)filename, (LPTSTR)prefix, &pStream); PY_INTERFACE_POSTCALL; + done: + PyWinObject_FreeString(filename); + PyWinObject_FreeString(prefix); + + if (PyErr_Occurred()) + return NULL; + if (FAILED(hRes)) return OleSetOleError(hRes); return PyCom_PyObjectFromIUnknown(pStream, IID_IStream, FALSE); } %} -%native(OpenStreamOnFile) PyOpenStreamOnFile; +// @pyswig item|HrGetOneProp|Retrieves the value of a single property from an IMAPIProp object. +%native(HrGetOneProp) PyHrGetOneProp; +%{ +PyObject *PyHrGetOneProp(PyObject *self, PyObject *args) +{ + HRESULT hRes; + PyObject *obProp; + ULONG propTag; + IMAPIProp *pProp = NULL; + PyObject *ret = NULL; + SPropValue *pPV = NULL; + + if (!PyArg_ParseTuple(args, "Ok:HrGetOneProp", + &obProp, // @pyparm <o PyIMAPIProp>|prop||Object to retrieve property value from. + &propTag))// @pyparm ULONG|propTag||The property tag to open. + return NULL; + + if (!PyCom_InterfaceFromPyObject(obProp, IID_IMAPIProp, (void **)&pProp, FALSE)) + goto done; + + PY_INTERFACE_PRECALL; + hRes = HrGetOneProp(pProp, propTag, &pPV); + PY_INTERFACE_POSTCALL; + if (FAILED(hRes)) + { + OleSetOleError(hRes); + goto done; + } + if ((ret = PyMAPIObject_FromSPropValue(pPV)) == NULL) + goto done; + + // PyMAPIObject_FromSPropValue does not raise an exception for types + // it cannot handle so that GetProps doesn't blow up. Since we are processing + // only a single item, we test for this condition, and raise an exception. + if (PyTuple_GET_ITEM(ret, 1) == Py_None && + PyLong_AsUnsignedLong(PyTuple_GET_ITEM(ret, 0)) != PT_NULL) + { + char buf[128]; + sprintf(buf, "Unsupported MAPI property type 0x%X", PROP_TYPE(pPV->ulPropTag)); + PyErr_SetString(PyExc_TypeError, buf); + Py_DECREF(ret); + ret = NULL; + } +done: + if (pProp) pProp->Release(); + MAPIFreeBuffer(pPV); + + return ret; +} +%} +// @pyswig item|HrSetOneProp|Sets the value of a single property on a IMAPIProp object. +%native(HrSetOneProp) PyHrSetOneProp; +%{ +PyObject *PyHrSetOneProp(PyObject *self, PyObject *args) +{ + HRESULT hRes; + PyObject *obProp; + PyObject *obPropValue; + ULONG propTag; + IMAPIProp *pProp = NULL; + PyObject *ret = NULL; + SPropValue *pPV = NULL; + + if (!PyArg_ParseTuple(args, "OO:HrSetOneProp", + &obProp, // @pyparm <o PyIMAPIProp>|prop||Object to set property value on. + &obPropValue))// @pyparm <o PySPropValue>|propValue||Property value to set. + return NULL; + + if (!PyCom_InterfaceFromPyObject(obProp, IID_IMAPIProp, (void **)&pProp, FALSE)) + goto done; + if (S_OK != (hRes=MAPIAllocateBuffer(sizeof(SPropValue), (void **)&pPV))) + { + OleSetOleError(hRes); + goto done; + } + if (!PyMAPIObject_AsSPropValue(obPropValue, pPV, pPV)) + goto done; + + PY_INTERFACE_PRECALL; + hRes = HrSetOneProp(pProp, pPV); + PY_INTERFACE_POSTCALL; + if (FAILED(hRes)) + { + OleSetOleError(hRes); + goto done; + } + Py_INCREF(Py_None); + ret = Py_None; +done: + if (pProp) pProp->Release(); + MAPIFreeBuffer(pPV); + |
From: <pyw...@li...> - 2016-01-10 07:46:09
|
changeset f493b5fa45a8 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=f493b5fa45a8 summary: fix tp_compare/tp_as_async slot on py3k changeset 0c31e8c1039c in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=0c31e8c1039c summary: get things building with vs2015 and other changes introduced in 3.5 changeset aeed1c9d4bf9 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=aeed1c9d4bf9 summary: Fix that allows a property to be fetched on COM objects to work in more cases changeset 9eaa93a263fa in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=9eaa93a263fa summary: get pythonwin building with vs2015 changeset 06de33e3604d in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=06de33e3604d summary: more build tweaks (use py.exe in more places; build 3.6) diffstat: AutoDuck/common_top.mak | 2 +- CHANGES.txt | 3 +++ Pythonwin/stdafx.h | 4 ++++ Pythonwin/stdafxdde.h | 2 ++ Pythonwin/stdafxole.h | 2 ++ Pythonwin/stdafxpw.h | 1 + build_all.bat | 4 ++++ com/win32com/client/dynamic.py | 11 ++++++++--- make_all.bat | 11 +++++++---- setup.py | 25 ++++++++++++++++++++----- win32/src/win32wnet/PyNetresource.cpp | 4 ++++ 11 files changed, 56 insertions(+), 13 deletions(-) diffs (213 lines): diff -r 835a071ad7bf -r 06de33e3604d AutoDuck/common_top.mak --- a/AutoDuck/common_top.mak Mon Aug 24 18:56:44 2015 +1000 +++ b/AutoDuck/common_top.mak Sun Jan 10 12:34:56 2016 +1100 @@ -10,5 +10,5 @@ ADTAB = 8 HC = hcw /a /c /e HHC = hhc -PYTHON = python +PYTHON = py -2.7 diff -r 835a071ad7bf -r 06de33e3604d CHANGES.txt --- a/CHANGES.txt Mon Aug 24 18:56:44 2015 +1000 +++ b/CHANGES.txt Sun Jan 10 12:34:56 2016 +1100 @@ -8,6 +8,9 @@ * win32com - sys.argv[0] may be set to a bytes object instead of a string on Python 3 when implementing an in-process COM object. +* Fix that allows a property to be fetched on COM objects to work in more cases + (Fredrik Orderud via patch #155) + Since build 218: ---------------- * win32com.mapi diff -r 835a071ad7bf -r 06de33e3604d Pythonwin/stdafx.h --- a/Pythonwin/stdafx.h Mon Aug 24 18:56:44 2015 +1000 +++ b/Pythonwin/stdafx.h Sun Jan 10 12:34:56 2016 +1100 @@ -11,6 +11,10 @@ #define WINVER 0x0600 #endif +#define _USING_V110_SDK71_ +// MFC support for mbcs is going away, but no need for us to constantly be told... +#define NO_WARN_MBCS_MFC_DEPRECATION + #include <afxwin.h> // MFC core and standard components #if (_MFC_VER < 0x0600) diff -r 835a071ad7bf -r 06de33e3604d Pythonwin/stdafxdde.h --- a/Pythonwin/stdafxdde.h Mon Aug 24 18:56:44 2015 +1000 +++ b/Pythonwin/stdafxdde.h Sun Jan 10 12:34:56 2016 +1100 @@ -1,3 +1,5 @@ +#define _USING_V110_SDK71_ + #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxmt.h> // Thread safety! diff -r 835a071ad7bf -r 06de33e3604d Pythonwin/stdafxole.h --- a/Pythonwin/stdafxole.h Mon Aug 24 18:56:44 2015 +1000 +++ b/Pythonwin/stdafxole.h Sun Jan 10 12:34:56 2016 +1100 @@ -5,6 +5,8 @@ #define WIN32_LEAN_AND_MEAN +#define _USING_V110_SDK71_ + #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxcmn.h> // common controls. diff -r 835a071ad7bf -r 06de33e3604d Pythonwin/stdafxpw.h --- a/Pythonwin/stdafxpw.h Mon Aug 24 18:56:44 2015 +1000 +++ b/Pythonwin/stdafxpw.h Sun Jan 10 12:34:56 2016 +1100 @@ -4,6 +4,7 @@ // #define HIER_LIST #define WIN32_LEAN_AND_MEAN +#define _USING_V110_SDK71_ #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions diff -r 835a071ad7bf -r 06de33e3604d build_all.bat --- a/build_all.bat Mon Aug 24 18:56:44 2015 +1000 +++ b/build_all.bat Sun Jan 10 12:34:56 2016 +1100 @@ -34,6 +34,10 @@ @if errorlevel 1 goto failed py -3.5 setup3.py -q build @if errorlevel 1 goto failed +py -3.6-32 setup3.py -q build +@if errorlevel 1 goto failed +py -3.6 setup3.py -q build +@if errorlevel 1 goto failed goto xit :failed diff -r 835a071ad7bf -r 06de33e3604d com/win32com/client/dynamic.py --- a/com/win32com/client/dynamic.py Mon Aug 24 18:56:44 2015 +1000 +++ b/com/win32com/client/dynamic.py Sun Jan 10 12:34:56 2016 +1100 @@ -113,9 +113,14 @@ userName = str(userName) return (_GetGoodDispatch(IDispatch, clsctx), userName) -def _GetDescInvokeType(entry, default_invoke_type): - if not entry or not entry.desc: return default_invoke_type - return entry.desc[4] +def _GetDescInvokeType(entry, invoke_type): + # determine the wFlags argument passed as input to IDispatch::Invoke + if not entry or not entry.desc: return invoke_type + varkind = entry.desc[4] # from VARDESC struct returned by ITypeComp::Bind + if varkind == pythoncom.VAR_DISPATCH and invoke_type == pythoncom.INVOKE_PROPERTYGET: + return pythoncom.INVOKE_FUNC | invoke_type # DISPATCH_METHOD & DISPATCH_PROPERTYGET can be combined in IDispatch::Invoke + else: + return invoke_type def Dispatch(IDispatch, userName = None, createClass = None, typeinfo = None, UnicodeToString=None, clsctx = pythoncom.CLSCTX_SERVER): assert UnicodeToString is None, "this is deprecated and will go away" diff -r 835a071ad7bf -r 06de33e3604d make_all.bat --- a/make_all.bat Mon Aug 24 18:56:44 2015 +1000 +++ b/make_all.bat Sun Jan 10 12:34:56 2016 +1100 @@ -2,12 +2,12 @@ @if "%1"=="already_built" goto already_built if exist build\. rm -rf build if exist build\. goto couldnt_rm +:quick +call build_all.bat cd autoduck call make.bat @if errorlevel 1 goto failed cd .. -:quick -call build_all.bat :already_built rem Now the binaries. @@ -37,8 +37,11 @@ py -3.4-32 setup3.py -q bdist_wininst --target-version=3.4 --skip-build py -3.4-32 setup3.py -q bdist_wininst --target-version=3.4 --skip-build --plat-name=win-amd64 -py -3.5-32 setup3.py -q bdist_wininst --target-version=3.5 --skip-build -py -3.5-32 setup3.py -q bdist_wininst --target-version=3.5 --skip-build --plat-name=win-amd64 +py -3.5-32 setup3.py -q bdist_wininst --skip-build +py -3.5 setup3.py -q bdist_wininst --skip-build + +py -3.6-32 setup3.py -q bdist_wininst --skip-build +py -3.6 setup3.py -q bdist_wininst --skip-build rem And nuke the dirs one more time :) if exist build/bdist.win32/. rm -rf build/bdist.win32 diff -r 835a071ad7bf -r 06de33e3604d setup.py --- a/setup.py Mon Aug 24 18:56:44 2015 +1000 +++ b/setup.py Sun Jan 10 12:34:56 2016 +1100 @@ -107,11 +107,18 @@ from distutils.dep_util import newer_group, newer from distutils import dir_util, file_util -from distutils.sysconfig import get_python_lib +from distutils.sysconfig import get_python_lib, get_config_vars from distutils.filelist import FileList from distutils.errors import DistutilsExecError import distutils.util +# prevent the new in 3.5 suffix of "cpXX-win32" from being added. +# (adjusting both .cp35-win_amd64.pyd and .cp35-win32.pyd to .pyd) +try: + get_config_vars()["EXT_SUFFIX"] = re.sub("\\.cp\d\d-win((32)|(_amd64))", "", get_config_vars()["EXT_SUFFIX"]) +except KeyError: + pass # no EXT_SUFFIX in this build. + build_id_patch = build_id if not "." in build_id_patch: build_id_patch = build_id_patch + ".0" @@ -803,8 +810,10 @@ # Exclude exchange 32-bit utility libraries from 64-bit # builds. Note that the exchange module now builds, but only # includes interfaces for 64-bit builds. - if self.plat_name == 'win-amd64' and ext.name in ['exchdapi']: + if self.plat_name == 'win-amd64' and ext.name in ['exchdapi', 'exchange']: return "No 64-bit library for utility functions available." + if get_build_version() >=14 and ext.name in ['exchdapi', 'exchange']: + return "Haven't worked out how to make exchange modules build on vs2015" include_dirs = self.compiler.include_dirs + \ os.environ.get("INCLUDE", "").split(os.pathsep) if self.windows_h_version is None: @@ -1037,17 +1046,23 @@ raise RuntimeError("Can't find %r" % (src,)) self.copy_file(src, target_dir) else: - # vs2008 or vs2010 + plat_dir_64 = "x64" + # 2.6, 2.7, 3.0, 3.1 and 3.2 all use(d) vs2008 (compiler version 1500) if sys.hexversion < 0x3030000: product_key = r"SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VC" plat_dir_64 = "amd64" mfc_dir = "Microsoft.VC90.MFC" mfc_files = "mfc90.dll mfc90u.dll mfcm90.dll mfcm90u.dll Microsoft.VC90.MFC.manifest".split() - else: + # 3.3 and 3.4 use(d) vs2010 (compiler version 1600, crt=10) + elif sys.hexversion < 0x3050000: product_key = r"SOFTWARE\Microsoft\VisualStudio\10.0\Setup\VC" - plat_dir_64 = "x64" mfc_dir = "Microsoft.VC100.MFC" mfc_files = ["mfc100u.dll", "mfcm100u.dll"] + # 3.5 and later on vs2015 (compiler version 1900, crt=14) + else: + product_key = r"SOFTWARE\Microsoft\VisualStudio\14.0\Setup\VC" + mfc_dir = "Microsoft.VC140.MFC" + mfc_files = ["mfc140u.dll", "mfcm140u.dll"] # On a 64bit host, the value we are looking for is actually in # SysWow64Node - but that is only available on xp and later. diff -r 835a071ad7bf -r 06de33e3604d win32/src/win32wnet/PyNetresource.cpp --- a/win32/src/win32wnet/PyNetresource.cpp Mon Aug 24 18:56:44 2015 +1000 +++ b/win32/src/win32wnet/PyNetresource.cpp Sun Jan 10 12:34:56 2016 +1100 @@ -87,7 +87,11 @@ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ +#if (PY_VERSION_HEX >= 0x03000000) + 0, /* tp_as_async */ +#else PyNETRESOURCE::compareFunc, /* tp_compare */ +#endif 0, /* tp_repr */ 0, /* tp_as_number */ 0, /* tp_as_sequence */ |
From: <pyw...@li...> - 2016-01-11 23:36:18
|
changeset 6d095bc9788e in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=6d095bc9788e summary: add more changes since build 219 changeset 0881d310bb60 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=0881d310bb60 summary: fix issue that caused postinstall log to not be shown and remove outdated MFC warnings changeset 3b52e797727d in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=3b52e797727d summary: more build fixes changeset f30ccd8f8f38 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=f30ccd8f8f38 summary: Build 220 changeset 77206efaed5e in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=77206efaed5e summary: Added tag b220 for changeset f30ccd8f8f38 diffstat: .hgtags | 1 + CHANGES.txt | 17 +++++++++++++++++ make_all.bat | 16 ++++++++++++---- pywin32_postinstall.py | 33 +++++++-------------------------- setup.py | 2 +- 5 files changed, 38 insertions(+), 31 deletions(-) diffs (127 lines): diff -r 06de33e3604d -r 77206efaed5e .hgtags --- a/.hgtags Sun Jan 10 12:34:56 2016 +1100 +++ b/.hgtags Tue Jan 12 10:36:02 2016 +1100 @@ -52,3 +52,4 @@ e97376eb14b6d95e79e01e1bf68ef8427bcbafdc b218.3 2d79b6bd94bc145f7f5a6e1c63d626737fc98e6c 218.5 713ac73c22e54a9d727f2fa4803b8c8939b14966 b219 +f30ccd8f8f38d37a94b3a105dc357f28501f67ba b220 diff -r 06de33e3604d -r 77206efaed5e CHANGES.txt --- a/CHANGES.txt Sun Jan 10 12:34:56 2016 +1100 +++ b/CHANGES.txt Tue Jan 12 10:36:02 2016 +1100 @@ -5,12 +5,29 @@ However contributors are encouraged to add their own entries for their work. Since build 219: +---------------- * win32com - sys.argv[0] may be set to a bytes object instead of a string on Python 3 when implementing an in-process COM object. * Fix that allows a property to be fetched on COM objects to work in more cases (Fredrik Orderud via patch #155) +* Disabled exchange and exchdapi modules on Python 2.5 due to unresolved + build issues. + +* Fix potential crash in SHGetIDListFromObject and SHGetFileInfo issues (rupole) + +* Allow GetShortPathName to handle long paths in unicode mode (ruple) + +* Fix intermittent crash in win32cred.CredRead() (bug #670, rupole) + +* Support PT_MV_BINARY MAPI properties, (patch #37) and many other MAPI + improvements (Nick Czeczulin) + +* Fix username used with EvtOpenSession (bug #688, rupole) + +* Fix OutputDebugString encoding in wide builds (patch #142, rupole) + Since build 218: ---------------- * win32com.mapi diff -r 06de33e3604d -r 77206efaed5e make_all.bat --- a/make_all.bat Sun Jan 10 12:34:56 2016 +1100 +++ b/make_all.bat Tue Jan 12 10:36:02 2016 +1100 @@ -37,11 +37,19 @@ py -3.4-32 setup3.py -q bdist_wininst --target-version=3.4 --skip-build py -3.4-32 setup3.py -q bdist_wininst --target-version=3.4 --skip-build --plat-name=win-amd64 -py -3.5-32 setup3.py -q bdist_wininst --skip-build -py -3.5 setup3.py -q bdist_wininst --skip-build +rem *sob* - for some reason 3.5 and later are failing to remove the bdist temp dir +rem due to the mfc DLLs - but the dir can be removed manually. +rem I've excluded the possibility of anti-virus or the indexer. +rem So manually nuke them before builds. +@if exist build\bdist.win32 rd /s/q build\bdist.win32 & @if exist build\bdist.amd64 rd /s/q build\bdist.amd64 +py -3.5-32 setup3.py -q bdist_wininst --target-version=3.5 --skip-build +@if exist build\bdist.win32 rd /s/q build\bdist.win32 & @if exist build\bdist.amd64 rd /s/q build\bdist.amd64 +py -3.5 setup3.py -q bdist_wininst --target-version=3.5 --skip-build --plat-name=win-amd64 -py -3.6-32 setup3.py -q bdist_wininst --skip-build -py -3.6 setup3.py -q bdist_wininst --skip-build +@if exist build\bdist.win32 rd /s/q build\bdist.win32 & @if exist build\bdist.amd64 rd /s/q build\bdist.amd64 +py -3.6-32 setup3.py -q bdist_wininst --target-version=3.6 --skip-build +@if exist build\bdist.win32 rd /s/q build\bdist.win32 & @if exist build\bdist.amd64 rd /s/q build\bdist.amd64 +py -3.6 setup3.py -q bdist_wininst --target-version=3.6 --skip-build --plat-name=win-amd64 rem And nuke the dirs one more time :) if exist build/bdist.win32/. rm -rf build/bdist.win32 diff -r 06de33e3604d -r 77206efaed5e pywin32_postinstall.py --- a/pywin32_postinstall.py Sun Jan 10 12:34:56 2016 +1100 +++ b/pywin32_postinstall.py Tue Jan 12 10:36:02 2016 +1100 @@ -26,6 +26,13 @@ pass tee_f.flush() +# For some unknown reason, when running under bdist_wininst we will start up +# with sys.stdout as None but stderr is hooked up. This work-around allows +# bdist_wininst to see the output we write and display it at the end of +# the install. +if sys.stdout is None: + sys.stdout = sys.stderr + sys.stderr = Tee(sys.stderr) sys.stdout = Tee(sys.stdout) @@ -448,32 +455,6 @@ except Exception, details: print details - # Check the MFC dll exists - it is doesn't, point them at it - # (I should install it, but its a bit tricky with distutils) - # Unfortunately, this is quite likely on Windows XP and MFC71.dll - if sys.hexversion < 0x2060000: - mfc_dll = "mfc71.dll" - elif sys.hexversion < 0x2070000: - mfc_dll = "mfc90.dll" - elif sys.hexversion < 0x3000000: - mfc_dll = "mfc90u.dll" - else: - mfc_dll = "mfc100u.dll" - try: - # It might be next to pythonwin itself (which is where setup.py - # currently arranges for it to be installed...) - if not os.path.isfile(os.path.join(lib_dir, "pythonwin", mfc_dll)): - win32api.SearchPath(None, mfc_dll) - except win32api.error: - print "*" * 20, "WARNING", "*" * 20 - print "It appears that the MFC DLL '%s' is not installed" % (mfc_dll,) - print "Pythonwin will not work without this DLL, and I haven't had the" - print "time to package it in with the installer." - print - print "You can download this DLL from:" - print "http://starship.python.net/crew/mhammond/win32/" - print "*" * 50 - # importing win32com.client ensures the gen_py dir created - not strictly # necessary to do now, but this makes the installation "complete" try: diff -r 06de33e3604d -r 77206efaed5e setup.py --- a/setup.py Sun Jan 10 12:34:56 2016 +1100 +++ b/setup.py Tue Jan 12 10:36:02 2016 +1100 @@ -1,4 +1,4 @@ -build_id="219.5" # may optionally include a ".{patchno}" suffix. +build_id="220" # may optionally include a ".{patchno}" suffix. # Putting buildno at the top prevents automatic __doc__ assignment, and # I *want* the build number at the top :) __doc__="""This is a distutils setup-script for the pywin32 extensions |