Thread: [pywin32-checkins] /hgroot/pywin32/pywin32: 3 new changesets
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: <pyw...@li...> - 2012-07-09 07:04:36
|
changeset 490c80b1b8ce in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=490c80b1b8ce summary: add a struct without a GUID to the pycom test object changeset 1a053eff8b4a in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=1a053eff8b4a summary: fix check for null guid when generating support code for structs changeset 16707e6f1624 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=16707e6f1624 summary: various hacks to get Python 3.3 support building with vs2010 diffstat: Pythonwin/Scintilla/win32/scintilla_vc6.mak | 2 +- com/TestSources/PyCOMTest/PyCOMTest.idl | 5 + com/win32com/__init__.py | 5 +- com/win32com/client/genpy.py | 4 +- pywin32_postinstall.py | 6 +- setup.py | 46 ++++++++---- win32/PythonService EXE.dsp | 103 ---------------------------- 7 files changed, 47 insertions(+), 124 deletions(-) diffs (281 lines): diff -r c71db94c80b4 -r 16707e6f1624 Pythonwin/Scintilla/win32/scintilla_vc6.mak --- a/Pythonwin/Scintilla/win32/scintilla_vc6.mak Thu Jun 21 20:49:58 2012 -0400 +++ b/Pythonwin/Scintilla/win32/scintilla_vc6.mak Mon Jul 09 17:04:08 2012 +1000 @@ -42,7 +42,7 @@ CXXNDEBUG=-O1 -MT -DNDEBUG NAME=-Fo # If you have problems with lexers being linked, try removing -OPT:REF and replacing with -OPT:NOREF -LDFLAGS=-OPT:NOWIN98 -OPT:REF +#LDFLAGS=-OPT:NOWIN98 -OPT:REF LDDEBUG= LIBS=KERNEL32.lib USER32.lib GDI32.lib IMM32.lib OLE32.LIB NOLOGO=-nologo diff -r c71db94c80b4 -r 16707e6f1624 com/TestSources/PyCOMTest/PyCOMTest.idl --- a/com/TestSources/PyCOMTest/PyCOMTest.idl Thu Jun 21 20:49:58 2012 -0400 +++ b/com/TestSources/PyCOMTest/PyCOMTest.idl Mon Jul 09 17:04:08 2012 +1000 @@ -84,6 +84,11 @@ int int_value; BSTR str_value; } TestStruct1; + typedef [version(1.0)] + struct tagStructWithoutUUID { + int int_value; + BSTR str_value; + } StructWithoutUUID; // Test enumerators. [ diff -r c71db94c80b4 -r 16707e6f1624 com/win32com/__init__.py --- a/com/win32com/__init__.py Thu Jun 21 20:49:58 2012 -0400 +++ b/com/win32com/__init__.py Mon Jul 09 17:04:08 2012 +1000 @@ -87,7 +87,10 @@ if not __gen_path__: try: import win32com.gen_py - __gen_path__ = sys.modules["win32com.gen_py"].__path__[0] + # hrmph - 3.3 throws: TypeError: '_NamespacePath' object does not support indexing + # attempting to get __path__[0] - but I can't quickly repro this stand-alone. + # Work around it by using an iterator. + __gen_path__ = next(iter(sys.modules["win32com.gen_py"].__path__)) except ImportError: # If a win32com\gen_py directory already exists, then we use it # (gencache doesn't insist it have an __init__, but our __import__ diff -r c71db94c80b4 -r 16707e6f1624 com/win32com/client/genpy.py --- a/com/win32com/client/genpy.py Thu Jun 21 20:49:58 2012 -0400 +++ b/com/win32com/client/genpy.py Mon Jul 09 17:04:08 2012 +1000 @@ -896,8 +896,8 @@ print >> stream, 'RecordMap = {' for record in recordItems.itervalues(): - if str(record.clsid) == pythoncom.IID_NULL: - print >> stream, "\t###%s: %s, # Typedef disabled because it doesn't have a non-null GUID" % (repr(record.doc[0]), repr(str(record.clsid))) + if record.clsid == pythoncom.IID_NULL: + print >> stream, "\t###%s: %s, # Record disabled because it doesn't have a non-null GUID" % (repr(record.doc[0]), repr(str(record.clsid))) else: print >> stream, "\t%s: %s," % (repr(record.doc[0]), repr(str(record.clsid))) print >> stream, "}" diff -r c71db94c80b4 -r 16707e6f1624 pywin32_postinstall.py --- a/pywin32_postinstall.py Thu Jun 21 20:49:58 2012 -0400 +++ b/pywin32_postinstall.py Mon Jul 09 17:04:08 2012 +1000 @@ -455,8 +455,12 @@ mfc_dll = "mfc42.dll" elif 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 = "mfc90.dll" + mfc_dll = "mfc100u.dll" try: # It might be next to pythonwin itself (which is where setup.py # currently arranges for it to be installed...) diff -r c71db94c80b4 -r 16707e6f1624 setup.py --- a/setup.py Thu Jun 21 20:49:58 2012 -0400 +++ b/setup.py Mon Jul 09 17:04:08 2012 +1000 @@ -1,4 +1,4 @@ -build_id="217" # may optionally include a ".{patchno}" suffix. +build_id="217.1" # 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 @@ -295,10 +295,12 @@ break def monkeypatched_link(self, target_desc, objects, output_filename, *args, **kw): - self._want_assembly_kept = os.path.basename(output_filename).startswith("PyISAPI_loader.dll") or \ - os.path.basename(output_filename).startswith("perfmondata.dll") or \ - os.path.basename(output_filename).startswith("win32ui.pyd") or \ - target_desc==self.EXECUTABLE + # no manifests for 3.3+ + self._want_assembly_kept = sys.version_info < (3,3) and \ + (os.path.basename(output_filename).startswith("PyISAPI_loader.dll") or \ + os.path.basename(output_filename).startswith("perfmondata.dll") or \ + os.path.basename(output_filename).startswith("win32ui.pyd") or \ + target_desc==self.EXECUTABLE) try: return self._orig_link(target_desc, objects, output_filename, *args, **kw) finally: @@ -985,9 +987,10 @@ largs.append("/IMPLIB:" + os.path.join(build_temp, "PythonCOMLoader"+suffix+".lib")) largs.append(obj) self.spawn(largs) - # and the manifest - out_arg = '-outputresource:%s;2' % (dll,) - self.spawn(['mt.exe', '-nologo', '-manifest', temp_manifest, out_arg]) + # and the manifest if one exists. + if os.path.isfile(temp_manifest): + out_arg = '-outputresource:%s;2' % (dll,) + self.spawn(['mt.exe', '-nologo', '-manifest', temp_manifest, out_arg]) def build_extensions(self): # First, sanity-check the 'extensions' list @@ -1033,7 +1036,7 @@ # Not sure how to make this completely generic, and there is no # need at this stage. - if sys.version_info > (2,6): + if sys.version_info > (2,6) and sys.version_info < (3, 3): # only stuff built with msvc9 needs this loader. self._build_pycom_loader() self._build_scintilla() @@ -1066,25 +1069,35 @@ raise RuntimeError("Can't find %r" % (src,)) self.copy_file(src, target_dir) else: + # vs2008 or vs2010 + 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: + 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"] + # On a 64bit host, the value we are looking for is actually in # SysWow64Node - but that is only available on xp and later. access = _winreg.KEY_READ if sys.getwindowsversion()[0] >= 5: access = access | 512 # KEY_WOW64_32KEY if self.plat_name == 'win-amd64': - plat_dir = "amd64" + plat_dir = plat_dir_64 else: plat_dir = "x86" # Find the redist directory. - vckey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"SOFTWARE\Microsoft\VisualStudio\9.0\Setup\VC", + vckey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, product_key, 0, access) val, val_typ = _winreg.QueryValueEx(vckey, "ProductDir") - mfc_dir = os.path.join(val, "redist", plat_dir, "Microsoft.VC90.MFC") + mfc_dir = os.path.join(val, "redist", plat_dir, mfc_dir) if not os.path.isdir(mfc_dir): raise RuntimeError("Can't find the redist dir at %r" % (mfc_dir)) - files = "mfc90.dll mfc90u.dll mfcm90.dll mfcm90u.dll Microsoft.VC90.MFC.manifest".split() - for f in files: + for f in mfc_files: self.copy_file( os.path.join(mfc_dir, f), target_dir) except (EnvironmentError, RuntimeError), exc: @@ -2144,7 +2157,8 @@ W32_exe_files = [ WinExt_win32("pythonservice", - dsp_file = "win32/PythonService EXE.dsp", + sources=[os.path.join("win32", "src", s) for s in + "PythonService.cpp PythonService.rc".split()], unicode_mode = True, extra_link_args=["/SUBSYSTEM:CONSOLE"], libraries = "user32 advapi32 ole32 shell32"), diff -r c71db94c80b4 -r 16707e6f1624 win32/PythonService EXE.dsp --- a/win32/PythonService EXE.dsp Thu Jun 21 20:49:58 2012 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,103 +0,0 @@ -# Microsoft Developer Studio Project File - Name="PythonService EXE" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=PythonService EXE - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "PythonService EXE.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "PythonService EXE.mak" CFG="PythonService EXE - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "PythonService EXE - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "PythonService EXE - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName ""$/win32", YFAAAAAA" -# PROP Scc_LocalPath "." -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "PythonService EXE - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Build" -# PROP BASE Intermediate_Dir "Build\Temp\PythonService EXE\Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Build" -# PROP Intermediate_Dir "Build\Temp\PythonServiceExe\Release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -F90=df.exe -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MD /W3 /GX /Zi /O2 /D "UNICODE" /D "_UNICODE" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "NDEBUG" /D "STRICT" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0xc09 /d "NDEBUG" -# ADD RSC /l 0xc09 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 -# ADD LINK32 Advapi32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Build\PythonService.exe" /implib:"Build\PythonService_exe.lib" /libpath:"./Build" -# SUBTRACT LINK32 /pdb:none - -!ELSEIF "$(CFG)" == "PythonService EXE - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Build" -# PROP BASE Intermediate_Dir "Build\Temp\PythonService EXE\Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Build" -# PROP Intermediate_Dir "Build\Temp\PythonServiceExe\Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -F90=df.exe -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c -# ADD CPP /nologo /MDd /W3 /GX /ZI /Od /D "UNICODE" /D "_UNICODE" /D "WIN32" /D "_WINDOWS" /D "__WIN32__" /D "_DEBUG" /D "STRICT" /YX /FD /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" -# ADD BASE RSC /l 0xc09 /d "_DEBUG" -# ADD RSC /l 0xc09 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 Advapi32.lib /nologo /subsystem:console /debug /machine:I386 /out:"Build\PythonService_d.exe" /pdbtype:sept /libpath:".\Build" -# SUBTRACT LINK32 /pdb:none - -!ENDIF - -# Begin Target - -# Name "PythonService EXE - Win32 Release" -# Name "PythonService EXE - Win32 Debug" -# Begin Source File - -SOURCE=.\src\PythonService.cpp -# End Source File -# Begin Source File - -SOURCE=.\src\PythonService.rc -# End Source File -# End Target -# End Project |
From: <pyw...@li...> - 2012-09-20 18:39:55
|
changeset c4d977bc3ee9 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=c4d977bc3ee9 summary: Add Get/SetCurrentProcessExplicitAppUserModelID changeset da480ad27dbc in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=da480ad27dbc summary: Autoduck fixes changeset 9648d478ad21 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=9648d478ad21 summary: Correct size of buffer passed to GetCommandString diffstat: com/win32comext/shell/src/PyIContextMenu.cpp | 11 +++-- com/win32comext/shell/src/PyIShellLink.cpp | 48 ++++++++++++----------- com/win32comext/shell/src/shell.cpp | 54 ++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 27 deletions(-) diffs (278 lines): diff -r 977f4f21ae8b -r 9648d478ad21 com/win32comext/shell/src/PyIContextMenu.cpp --- a/com/win32comext/shell/src/PyIContextMenu.cpp Mon Sep 10 17:23:43 2012 -0400 +++ b/com/win32comext/shell/src/PyIContextMenu.cpp Thu Sep 20 14:15:56 2012 -0400 @@ -97,13 +97,16 @@ UINT cchMax = 2048; if ( !PyArg_ParseTuple(args, "OI|I:GetCommandString", &obCmd, &uType, &cchMax) ) return NULL; - if (uType & GCS_UNICODE) - cchMax *= sizeof(WCHAR); // buffer size is in characters + UINT_PTR idCmd; if (!PyWinLong_AsULONG_PTR(obCmd, (ULONG_PTR *)&idCmd)) return NULL; - - char *buf = (char *)malloc(cchMax); + // buffer size is in characters + char *buf; + if (uType & GCS_UNICODE) + buf = (char *)malloc(cchMax * sizeof(WCHAR)); + else + buf = (char *)malloc(cchMax); if (!buf) return PyErr_NoMemory(); HRESULT hr; diff -r 977f4f21ae8b -r 9648d478ad21 com/win32comext/shell/src/PyIShellLink.cpp --- a/com/win32comext/shell/src/PyIShellLink.cpp Mon Sep 10 17:23:43 2012 -0400 +++ b/com/win32comext/shell/src/PyIShellLink.cpp Thu Sep 20 14:15:56 2012 -0400 @@ -27,7 +27,7 @@ return (IShellLink *)PyIUnknown::GetI(self); } -// @pymethod name, <o WIN32_FIND_DATA>|PyIShellLink|GetPath|Retrieves the path and file name of a shell link object +// @pymethod str, <o WIN32_FIND_DATA>|PyIShellLink|GetPath|Retrieves the target path and file name of a shell link object // @comm The AlternateFileName (8.3) member of WIN32_FIND_DATA does not return information PyObject *PyIShellLink::GetPath(PyObject *self, PyObject *args) { @@ -40,7 +40,7 @@ // @flag SLGP_SHORTPATH|Retrieves the standard short (8.3 format) file name. // @flag SLGP_UNCPRIORITY|Retrieves the Universal Naming Convention (UNC) path name of the file. // @flag SLGP_RAWPATH|Retrieves the raw path name. A raw path is something that might not exist and may include environment variables that need to be expanded. - // @pyparm int|cchMaxPath|_MAX_PATH|Description for cchMaxPath + // @pyparm int|cchMaxPath|_MAX_PATH|Number of characters to allocate for returned filename int cchMaxPath = _MAX_PATH; DWORD fFlags; if ( !PyArg_ParseTuple(args, "l|i:GetPath", &fFlags, &cchMaxPath) ) @@ -67,7 +67,7 @@ return ret; } -// @pymethod string|PyIShellLink|GetIDList|Retrieves the list of item identifiers for a shell link object. +// @pymethod <o PyIDL>|PyIShellLink|GetIDList|Retrieves the item id list that identifies the target of the shell link. PyObject *PyIShellLink::GetIDList(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); @@ -86,7 +86,7 @@ return PyObject_FromPIDL(pidl, TRUE); } -// @pymethod |PyIShellLink|SetIDList|Sets the list of item identifiers for a shell link object. +// @pymethod |PyIShellLink|SetIDList|Sets the target of the link using an item id list PyObject *PyIShellLink::SetIDList(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); @@ -94,11 +94,11 @@ return NULL; LPITEMIDLIST pidl; PyObject *obpidl; + // @pyparm <o PyIDL>|pidl||Absolute item id list that identifies the target if ( !PyArg_ParseTuple(args, "O:SetIDList", &obpidl) ) return NULL; - BOOL bPythonIsHappy = TRUE; - if (bPythonIsHappy && !PyObject_AsPIDL( obpidl, &pidl )) bPythonIsHappy = FALSE; - if (!bPythonIsHappy) return NULL; + if (!PyObject_AsPIDL( obpidl, &pidl )) + return NULL; HRESULT hr; PY_INTERFACE_PRECALL; hr = pISL->SetIDList( pidl ); @@ -112,13 +112,13 @@ return Py_None; } -// @pymethod |PyIShellLink|GetDescription|Description of GetDescription. +// @pymethod str|PyIShellLink|GetDescription|Retrieves the description of the link (displays as Comment in the UI) PyObject *PyIShellLink::GetDescription(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); if ( pISL == NULL ) return NULL; - // @pyparm int|cchMaxName|1024|Description for cchMaxName + // @pyparm int|cchMaxName|1024|Number of character to allocate for the retrieved text int cchMaxName = 1024; if ( !PyArg_ParseTuple(args, "|i:GetDescription", &cchMaxName) ) return NULL; @@ -141,13 +141,14 @@ return ret; } -// @pymethod |PyIShellLink|SetDescription|Description of SetDescription. +// @pymethod |PyIShellLink|SetDescription|Sets the description of the link (displays as Comment in the UI) PyObject *PyIShellLink::SetDescription(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); if ( pISL == NULL ) return NULL; PyObject *obName; + // @pyparm str|Name||The description for the link if ( !PyArg_ParseTuple(args, "O:SetDescription", &obName) ) return NULL; TCHAR *pszName; @@ -165,13 +166,13 @@ return Py_None; } -// @pymethod |PyIShellLink|GetWorkingDirectory|Description of GetWorkingDirectory. +// @pymethod str|PyIShellLink|GetWorkingDirectory|Retrieves the working directory for the link PyObject *PyIShellLink::GetWorkingDirectory(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); if ( pISL == NULL ) return NULL; - // @pyparm int|cchMaxName|1024|Description for cchMaxName + // @pyparm int|cchMaxName|1024|Number of characters to allocate for returned text int cchMaxName = 1024; if ( !PyArg_ParseTuple(args, "|i:GetWorkingDirectory", &cchMaxName) ) return NULL; @@ -194,13 +195,14 @@ return ret; } -// @pymethod |PyIShellLink|SetWorkingDirectory|Description of SetWorkingDirectory. +// @pymethod |PyIShellLink|SetWorkingDirectory|Sets the working directory for the link. PyObject *PyIShellLink::SetWorkingDirectory(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); if ( pISL == NULL ) return NULL; PyObject *obName; + // @pyparm str|Dir||The working directory for the link if ( !PyArg_ParseTuple(args, "O:SetWorkingDirectory", &obName) ) return NULL; TCHAR *pszName; @@ -219,7 +221,7 @@ } -// @pymethod string|PyIShellLink|GetArguments|Retrieves the command-line arguments associated with a shell link object. +// @pymethod str|PyIShellLink|GetArguments|Retrieves the command-line arguments associated with a shell link object. PyObject *PyIShellLink::GetArguments(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); @@ -255,7 +257,7 @@ if ( pISL == NULL ) return NULL; PyObject *obArgs; - // @pyparm string|args||The new arguments. + // @pyparm str|args||The new arguments. if ( !PyArg_ParseTuple(args, "O:SetArguments", &obArgs) ) return NULL; TCHAR *pszArgs; @@ -358,7 +360,7 @@ } -// @pymethod string|PyIShellLink|GetIconLocation|Retrieves the location (path and index) of the icon for a shell link object. +// @pymethod str|PyIShellLink|GetIconLocation|Retrieves the location (path and index) of the icon for a shell link object. PyObject *PyIShellLink::GetIconLocation(PyObject *self, PyObject *args) { IShellLink *pISL = GetI(self); @@ -516,16 +518,16 @@ return Py_None; } -// @object PyIShellLink|Description of the interface +// @object PyIShellLink|Interface used to access the properties of a shell link file (*.lnk) static struct PyMethodDef PyIShellLink_methods[] = { { "GetPath", PyIShellLink::GetPath, 1 }, // @pymeth GetPath|Retrieves the path and file name of a shell link object. - { "GetIDList", PyIShellLink::GetIDList, 1 }, // @pymeth GetIDList|Retrieves the list of item identifiers for a shell link object. - { "SetIDList", PyIShellLink::SetIDList, 1 }, // @pymeth SetIDList|Sets the list of item identifiers for a shell link object. - { "GetDescription", PyIShellLink::GetDescription, 1 }, // @pymeth GetDescription|Description of GetDescription - { "SetDescription", PyIShellLink::SetDescription, 1 }, // @pymeth SetDescription|Description of SetDescription - { "GetWorkingDirectory", PyIShellLink::GetWorkingDirectory, 1 }, // @pymeth GetWorkingDirectory|Description of GetWorkingDirectory - { "SetWorkingDirectory", PyIShellLink::SetWorkingDirectory, 1 }, // @pymeth SetWorkingDirectory|Description of SetWorkingDirectory + { "GetIDList", PyIShellLink::GetIDList, 1 }, // @pymeth GetIDList|Retrieves the item id list that identifies the target of the shell link. + { "SetIDList", PyIShellLink::SetIDList, 1 }, // @pymeth SetIDList|Sets the target of the link using an item id list + { "GetDescription", PyIShellLink::GetDescription, 1 }, // @pymeth GetDescription|Retrieves the description of the link (displays as Comment in the UI) + { "SetDescription", PyIShellLink::SetDescription, 1 }, // @pymeth SetDescription|Sets the description of the link (displays as Comment in the UI) + { "GetWorkingDirectory", PyIShellLink::GetWorkingDirectory, 1 }, // @pymeth GetWorkingDirectory|Retrieves the working directory for the link + { "SetWorkingDirectory", PyIShellLink::SetWorkingDirectory, 1 }, // @pymeth SetWorkingDirectory|Sets the working directory for the link { "GetArguments", PyIShellLink::GetArguments, 1 }, // @pymeth GetArguments|Retrieves the command-line arguments associated with a shell link object. { "SetArguments", PyIShellLink::SetArguments, 1 }, // @pymeth SetArguments|Sets the command-line arguments associated with a shell link object. { "GetHotkey", PyIShellLink::GetHotkey, 1 }, // @pymeth GetHotkey|Retrieves the hot key for a shell link object. diff -r 977f4f21ae8b -r 9648d478ad21 com/win32comext/shell/src/shell.cpp --- a/com/win32comext/shell/src/shell.cpp Mon Sep 10 17:23:43 2012 -0400 +++ b/com/win32comext/shell/src/shell.cpp Thu Sep 20 14:15:56 2012 -0400 @@ -168,6 +168,12 @@ typedef HRESULT (WINAPI *PFNSHCreateStreamOnFileEx)(LPCWSTR, DWORD, DWORD, BOOL, IStream *, IStream **); static PFNSHCreateStreamOnFileEx pfnSHCreateStreamOnFileEx = NULL; +typedef HRESULT (WINAPI *PFNSetCurrentProcessExplicitAppUserModelID)(WCHAR *); +static PFNSetCurrentProcessExplicitAppUserModelID pfnSetCurrentProcessExplicitAppUserModelID; + +typedef HRESULT (WINAPI *PFNGetCurrentProcessExplicitAppUserModelID)(WCHAR **); +static PFNGetCurrentProcessExplicitAppUserModelID pfnGetCurrentProcessExplicitAppUserModelID; + // Some magic hackery macros :-) #define _ILSkip(pidl, cb) ((LPITEMIDLIST)(((BYTE*)(pidl))+cb)) #define _ILNext(pidl) _ILSkip(pidl, (pidl)->mkid.cb) @@ -3271,6 +3277,50 @@ return PyCom_PyObjectFromIUnknown(ret, IID_IStream, FALSE); } +// @pymethod |shell|SetCurrentProcessExplicitAppUserModelID|Sets the taskbar identifier +static PyObject *PySetCurrentProcessExplicitAppUserModelID(PyObject *self, PyObject *args) +{ + // @comm Should be used early in process startup before creating any windows + // @comm Requires Windows 7 or later + // @pyparm str|AppID||The Application User Model ID used to group taskbar buttons + if (pfnSetCurrentProcessExplicitAppUserModelID==NULL) + return PyCom_BuildPyException(E_NOTIMPL); + TmpWCHAR appid; + PyObject *obappid; + if(!PyArg_ParseTuple(args, "O:SetCurrentProcessExplicitAppUserModelID", &obappid)) + return NULL; + if (!PyWinObject_AsWCHAR(obappid, &appid, FALSE)) + return NULL; + + HRESULT hr; + PY_INTERFACE_PRECALL; + hr = (*pfnSetCurrentProcessExplicitAppUserModelID)(appid); + PY_INTERFACE_POSTCALL; + if (FAILED(hr)) + return PyCom_BuildPyException(hr); + Py_INCREF(Py_None); + return Py_None; +} + +// @pymethod str|shell|GetCurrentProcessExplicitAppUserModelID|Retrieves the current taskbar identifier +// @comm Will only retrieve an identifier if set by the application, not a system-assigned default. +// @comm Requires Windows 7 or later +static PyObject *PyGetCurrentProcessExplicitAppUserModelID(PyObject *self, PyObject *args) +{ + if (pfnGetCurrentProcessExplicitAppUserModelID==NULL) + return PyCom_BuildPyException(E_NOTIMPL); + WCHAR* appid; + HRESULT hr; + PY_INTERFACE_PRECALL; + hr = (*pfnGetCurrentProcessExplicitAppUserModelID)(&appid); + PY_INTERFACE_POSTCALL; + if (FAILED(hr)) + return PyCom_BuildPyException(hr); + PyObject *ret = PyWinObject_FromWCHAR(appid); + CoTaskMemFree(appid); + return ret; +} + /* List of module functions */ // @module shell|A module wrapping Windows Shell functions and interfaces @@ -3331,6 +3381,8 @@ { "SHCreateShellItem", PySHCreateShellItem, METH_VARARGS}, // @pymeth SHCreateShellItem|Creates an IShellItem interface from a PIDL { "SHOpenFolderAndSelectItems", (PyCFunction)PySHOpenFolderAndSelectItems, METH_VARARGS|METH_KEYWORDS}, // @pymeth SHOpenFolderAndSelectItems|Displays a shell folder with items pre-selected { "SHCreateStreamOnFileEx", (PyCFunction)PySHCreateStreamOnFileEx, METH_VARARGS|METH_KEYWORDS}, // @pymeth SHCreateStreamOnFileEx|Creates a <o PyIStream> that reads and writes to a file + { "SetCurrentProcessExplicitAppUserModelID", PySetCurrentProcessExplicitAppUserModelID, METH_VARARGS}, // @pymeth SetCurrentProcessExplicitAppUserModelID|Sets the taskbar identifier + { "GetCurrentProcessExplicitAppUserModelID", PyGetCurrentProcessExplicitAppUserModelID, METH_NOARGS}, // @pymeth GetCurrentProcessExplicitAppUserModelID|Retrieves the current taskbar identifier { NULL, NULL }, }; @@ -3470,6 +3522,8 @@ pfnSHGetIDListFromObject =(PFNSHGetIDListFromObject)GetProcAddress(shell32, "SHGetIDListFromObject"); pfnSHCreateShellItem =(PFNSHCreateShellItem)GetProcAddress(shell32, "SHCreateShellItem"); pfnSHOpenFolderAndSelectItems = (PFNSHOpenFolderAndSelectItems)GetProcAddress(shell32, "SHOpenFolderAndSelectItems"); + pfnSetCurrentProcessExplicitAppUserModelID = (PFNSetCurrentProcessExplicitAppUserModelID)GetProcAddress(shell32, "SetCurrentProcessExplicitAppUserModelID"); + pfnGetCurrentProcessExplicitAppUserModelID = (PFNGetCurrentProcessExplicitAppUserModelID)GetProcAddress(shell32, "GetCurrentProcessExplicitAppUserModelID"); } // SHGetFolderPath comes from shfolder.dll on older systems if (pfnSHGetFolderPath==NULL){ |
From: <pyw...@li...> - 2013-03-29 13:00:50
|
changeset 391e96f815fc in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=391e96f815fc summary: Update adodbapi to version 2.4.3. Split supfolders into separate /test and /examples changeset f56cea9acff0 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=f56cea9acff0 summary: remove adodbapi tests directory changeset e7a557e939d7 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=e7a557e939d7 summary: remove adodbapi tests directory diffstat: .hgignore | 1 + .hgtags | 1 + CHANGES.txt | 10 +- adodbapi/ado_consts.py | 1 + adodbapi/adodbapi.py | 169 +- adodbapi/examples/db_print.py | 52 + adodbapi/examples/db_table_names.py | 24 + adodbapi/examples/test.mdb | 0 adodbapi/examples/xls_read.py | 43 + adodbapi/examples/xls_write.py | 32 + adodbapi/is64bit.py | 33 + adodbapi/readme.txt | 444 ++++--- adodbapi/schema_table.py | 15 + adodbapi/test/RunTests.bat | 22 + adodbapi/test/adodbapitest.py | 993 ++++++++++++++++++ adodbapi/test/adodbapitestconfig.py | 108 + adodbapi/test/dbapi20.py | 870 +++++++++++++++ adodbapi/test/is64bit.py | 33 + adodbapi/test/setuptestframework.py | 86 + adodbapi/test/test_adodbapi_dbapi20.py | 137 ++ adodbapi/test/tryconnection2.py | 10 + adodbapi/test/tryconnection3.py | 10 + adodbapi/tests/.cvsignore | 2 - adodbapi/tests/RunTests.bat | 20 - adodbapi/tests/adodbapitest.py | 924 ---------------- adodbapi/tests/adodbapitestconfig.py | 134 -- adodbapi/tests/db_print.py | 89 - adodbapi/tests/dbapi20.py | 867 --------------- adodbapi/tests/testADOdbapi.py | 919 ---------------- adodbapi/tests/testADOdbapiConfig.py | 138 -- adodbapi/tests/testRun.bat | 21 - adodbapi/tests/test_adodbapi_dbapi20.py | 123 -- com/win32com/src/PyComHelpers.cpp | 11 + com/win32com/src/PythonCOM.cpp | 343 ++++- com/win32com/src/Register.cpp | 21 +- com/win32com/src/extensions/PyICancelMethodCalls.cpp | 96 + com/win32com/src/extensions/PyIClientSecurity.cpp | 248 ++++ com/win32com/src/extensions/PyIContext.cpp | 141 ++ com/win32com/src/extensions/PyIEnumContextProps.cpp | 159 ++ com/win32com/src/extensions/PyIEnumSTATPROPSETSTG.cpp | 113 ++ com/win32com/src/extensions/PyIEnumSTATPROPSTG.cpp | 124 ++- com/win32com/src/extensions/PyIPropertySetStorage.cpp | 86 + com/win32com/src/extensions/PyIPropertyStorage.cpp | 364 ++++++- com/win32com/src/extensions/PyIServerSecurity.cpp | 197 +++ com/win32com/src/include/PyICancelMethodCalls.h | 41 + com/win32com/src/include/PyIClientSecurity.h | 60 + com/win32com/src/include/PyIContext.h | 23 + com/win32com/src/include/PyIEnumContextProps.h | 24 + com/win32com/src/include/PyIEnumSTATPROPSETSTG.h | 27 + com/win32com/src/include/PyIEnumSTATPROPSTG.h | 26 + com/win32com/src/include/PyIPropertySetStorage.h | 33 + com/win32com/src/include/PyIPropertyStorage.h | 64 + com/win32com/src/include/PyIServerSecurity.h | 55 + com/win32com/src/include/PythonCOM.h | 1 + com/win32com/src/include/stdafx.h | 5 +- com/win32comext/shell/demos/ITransferAdviseSink.py | 74 + com/win32comext/shell/shellcon.py | 84 + com/win32comext/shell/src/PyICurrentItem.cpp | 41 + com/win32comext/shell/src/PyICurrentItem.h | 36 + com/win32comext/shell/src/PyIDisplayItem.cpp | 42 + com/win32comext/shell/src/PyIDisplayItem.h | 36 + com/win32comext/shell/src/PyIEnumResources.cpp | 268 ++++ com/win32comext/shell/src/PyIEnumResources.h | 49 + com/win32comext/shell/src/PyIIdentityName.cpp | 41 + com/win32comext/shell/src/PyIIdentityName.h | 36 + com/win32comext/shell/src/PyIRelatedItem.cpp | 108 + com/win32comext/shell/src/PyIRelatedItem.h | 41 + com/win32comext/shell/src/PyIShellItemResources.cpp | 433 +++++++ com/win32comext/shell/src/PyIShellItemResources.h | 82 + com/win32comext/shell/src/PyITransferAdviseSink.cpp | 427 +++++++ com/win32comext/shell/src/PyITransferAdviseSink.h | 76 + com/win32comext/shell/src/PyITransferDestination.cpp | 194 +++ com/win32comext/shell/src/PyITransferDestination.h | 53 + com/win32comext/shell/src/PyITransferMediumItem.cpp | 41 + com/win32comext/shell/src/PyITransferMediumItem.h | 36 + com/win32comext/shell/src/PyITransferSource.cpp | 703 ++++++++++++ com/win32comext/shell/src/PyITransferSource.h | 107 + com/win32comext/shell/src/shell.cpp | 56 +- com/win32comext/shell/src/shell_pch.h | 8 + setup.py | 17 +- win32/src/win32print/win32print.cpp | 6 +- win32/src/win32process.i | 68 + 82 files changed, 8077 insertions(+), 3679 deletions(-) diffs (truncated from 12816 to 300 lines): diff -r 4c7503da2658 -r e7a557e939d7 .hgignore --- a/.hgignore Wed Feb 06 09:37:53 2013 -0500 +++ b/.hgignore Fri Mar 29 07:00:07 2013 -0600 @@ -17,6 +17,7 @@ *.pyo Pythonwin/Scintilla/win32/*.pdb PyWin32.kpf +.idea #Pycharm # COM test bits com\TestSources\Build diff -r 4c7503da2658 -r e7a557e939d7 .hgtags --- a/.hgtags Wed Feb 06 09:37:53 2013 -0500 +++ b/.hgtags Fri Mar 29 07:00:07 2013 -0600 @@ -49,3 +49,4 @@ b7968cc5d12a148df3005979adb804ab79dd1d17 b218 b7968cc5d12a148df3005979adb804ab79dd1d17 b218 ed400a27739ff3ff7a850e69f574a1ad66de6c5e b218 +e97376eb14b6d95e79e01e1bf68ef8427bcbafdc b218.3 diff -r 4c7503da2658 -r e7a557e939d7 CHANGES.txt --- a/CHANGES.txt Wed Feb 06 09:37:53 2013 -0500 +++ b/CHANGES.txt Fri Mar 29 07:00:07 2013 -0600 @@ -6,6 +6,12 @@ Since build 218: ---------------- +* adodbapi updated to version 2.4.3 -- new examples folder includes short programs for + reading and writing .xls spreadsheets and reading ACCESS .mdb files using SQL. + New functions .is64bit.Python() and .is64bit.os() to help pick the correct drivers. + New function .schema_table.names() returns a list of all tables in a database. + see adodbapi/README.txt for more information. + * Fix issue implementing COM objects from within a virtualenv (Kevin Smyth via issue #3597965) @@ -296,7 +302,7 @@ * Added win32inet.WinHttpGetDefaultProxyConfiguration() -* Pythonwin updates from Rémi Paucher; enter completes auto-complete in +* Pythonwin updates from R�mi Paucher; enter completes auto-complete in the editor and interactive windows, auto-complete should now work on French keyboards. (XXX - some of this was reverted - update!) @@ -622,7 +628,7 @@ multiple file names, prevent Windows handle leak in IQueryAssociations. * win32com.adsi: Always return extended error info when available, and expose ADsGetLastError explicitly. -* Leonard Ritter and Robert Förtsch contributed some IE extension samples +* Leonard Ritter and Robert F�rtsch contributed some IE extension samples (see win32com\demos) * .chm documentation now includes a link to search MSDN and google for many API functions diff -r 4c7503da2658 -r e7a557e939d7 adodbapi/ado_consts.py --- a/adodbapi/ado_consts.py Wed Feb 06 09:37:53 2013 -0500 +++ b/adodbapi/ado_consts.py Fri Mar 29 07:00:07 2013 -0600 @@ -26,6 +26,7 @@ # CommandTypeEnum adCmdText = 1 adCmdStoredProc = 4 +adSchemaTables = 20 # ParameterDirectionEnum adParamInput = 1 diff -r 4c7503da2658 -r e7a557e939d7 adodbapi/adodbapi.py --- a/adodbapi/adodbapi.py Wed Feb 06 09:37:53 2013 -0500 +++ b/adodbapi/adodbapi.py Fri Mar 29 07:00:07 2013 -0600 @@ -26,7 +26,7 @@ or IronPython version 2.6 and later, or, after running through 2to3.py, CPython 3.0 or later. """ -__version__ = '2.4.2.2' +__version__ = '2.4.3' version = 'adodbapi v' + __version__ # N.O.T.E.:... # if you have been using an older version of adodbapi and are getting errors because @@ -46,15 +46,9 @@ import win32com.decimal_23 as decimal # or # from django.utils import _decimal as decimal + onIronPython = sys.platform == 'cli' -if not onIronPython: - try: - import win32com.client - except ImportError: - import warnings - warnings.warn("pywin32 package required but not found.",ImportWarning) - -# --- define objects to smooth out IronPython <-> CPython differences +# --- define objects to smooth out IronPython <-> CPython differences if onIronPython: from System import Activator, Type, DBNull, DateTime, Array, Byte from System import Decimal as SystemDecimal @@ -66,13 +60,15 @@ return obj.Item[index] else: #pywin32 try: + import win32com.client import pythoncom import pywintypes pythoncom.__future_currency__ = True def Dispatch(dispatch): return win32com.client.Dispatch(dispatch) - except: - pass #warning already given above + except ImportError: + import warnings + warnings.warn("pywin32 package required but not found.",ImportWarning) def getIndexedValue(obj,index): return obj(index) DBNull = type(None) @@ -107,6 +103,22 @@ raise errorclass(errorvalue) # ----- Time converters ---------------------------------------------- + +# all purpose date to ISO format converter +def _dateObjectToIsoFormatString(obj): + if isinstance(obj, datetime.datetime): + s = obj.strftime('%Y-%m-%d %H:%M:%S') + elif isinstance(obj, datetime.date): #exact midnight + s = obj.strftime('%Y-%m-%d 00:00:00') + elif isinstance(obj, time.struct_time): + s = time.strftime('%Y-%m-%d %H:%M:%S',obj) + else: + try: #usually datetime.datetime + s = obj.isoformat() + except: #but may be mxdatetime + s = obj.Format('%Y-%m-%d %H:%M:%S') + return s + class TimeConverter(object): # this is a generic time converter skeleton def __init__(self): # the details will be filled in by instances self._ordinal_1899_12_31=datetime.date(1899,12,31).toordinal()-1 @@ -131,7 +143,7 @@ raise NotImplementedError #"Abstract class" def DateObjectToIsoFormatString(self,obj): "This function should return a string in the format 'YYYY-MM-dd HH:MM:SS:ms' (ms optional) " - raise NotImplementedError #"Abstract class" + raise NotImplementedError #"Abstract class" # -- Optional: if mx extensions are installed you may use mxDateTime ---- try: @@ -156,7 +168,7 @@ def Timestamp(self,year,month,day,hour,minute,second): return mx.DateTime.Timestamp(year,month,day,hour,minute,second) def DateObjectToIsoFormatString(self,obj): - return obj.Format('%Y-%m-%d %H:%M:%S') + return _dateObjectToIsoFormatString(obj) else: class mxDateTimeConverter(TimeConverter): pass # if no mx is installed @@ -203,16 +215,7 @@ fractPart = ms / 86400000.0 return integerPart + fractPart def DateObjectToIsoFormatString(self,obj): - if isinstance(obj,datetime.datetime): - s = obj.strftime('%Y-%m-%d %H:%M:%S') - elif isinstance(obj,datetime.date): #exact midnight - s = obj.strftime('%Y-%m-%d 00:00:00') - else: - try: #usually datetime.datetime - s = obj.isoformat() - except: #but may be mxdatetime - s = obj.Format('%Y-%m-%d %H:%M:%S') - return s + return _dateObjectToIsoFormatString(obj) class pythonTimeConverter(TimeConverter): # the old, ?nix type date and time def __init__(self): #caution: this Class gets confised by timezones and DST @@ -244,11 +247,7 @@ def Timestamp(self,year,month,day,hour,minute,second): return time.localtime(time.mktime((year,month,day,hour,minute,second,0,0,-1))) def DateObjectToIsoFormatString(self,obj): - try: - s = time.strftime('%Y-%m-%d %H:%M:%S',obj) - except: - s = obj.strftime('%Y-%m-%d') - return s + return _dateObjectToIsoFormatString(obj) dateconverter = pythonDateTimeConverter() # default # ----------------------------------------------------------- @@ -372,17 +371,16 @@ except: return '[]' -def _configure_parameter(p, value, settings_known): +def _configure_parameter(p, value, adotype, settings_known): """Configure the given ADO Parameter 'p' with the Python 'value'.""" - if verbose > 3: - print 'Configuring parameter %s type=%s value="%s"' % (p.Name,p.Type,repr(value)) - if p.Direction not in [adc.adParamInput, adc.adParamInputOutput, adc.adParamUnknown]: - return + if adotype in adoBinaryTypes: + p.Size = len(value) + p.AppendChunk(value) - if isinstance(value,StringTypes): #v2.1 Jevon + elif isinstance(value,StringTypes): #v2.1 Jevon L = len(value) - if p.Type in adoStringTypes: #v2.2.1 Cole + if adotype in adoStringTypes: #v2.2.1 Cole if settings_known: L = min(L,p.Size) #v2.1 Cole limit data to defined size p.Value = value[:L] #v2.1 Jevon & v2.1 Cole else: @@ -390,10 +388,6 @@ if L>0: #v2.1 Cole something does not like p.Size as Zero p.Size = L #v2.1 Jevon - elif isinstance(value, memoryViewType): - p.Size = len(value) - p.AppendChunk(value) - elif isinstance(value, decimal.Decimal): if onIronPython: s = str(value) @@ -415,7 +409,7 @@ p.Precision = digit_count + exponent elif type(value) in dateconverter.types: - if settings_known and p.Type in adoDateTimeTypes: + if settings_known and adotype in adoDateTimeTypes: p.Value=dateconverter.COMDate(value) else: #probably a string #Known problem with JET Provider. Date can not be specified as a COM date. @@ -425,7 +419,7 @@ p.Value = s p.Size = len(s) - elif isinstance(value, longType) and onIronPython: # Iron Python Long + elif onIronPython and isinstance(value, longType) and sys.version_info < (2,7,2): # Iron Python Long s = SystemDecimal(value) # feature workaround for IPy 2.0 p.Value = s @@ -911,20 +905,23 @@ cursor if the sproc defines an integer return value. """ self._new_command(procname, adc.adCmdStoredProc) - self._buildADOparameterList(procname, parameters) + self._buildADOparameterList(procname, parameters, do_refresh=True) + if verbose > 2: + print 'Params=', format_parameters(self.cmd.Parameters, True) self._execute_command() - if parameters != None: - retLst=[] - for p in tuple(self.cmd.Parameters): - if verbose > 2: - print 'returning=', p.Name, p.Type, p.Direction, repr(p.Value) - pyObject=_convert_to_python(p.Value,variantConversions[p.Type]) - if p.Direction == adc.adParamReturnValue: - self.returnValue=pyObject - else: - retLst.append(pyObject) - return retLst + retLst=[] + for p in tuple(self.cmd.Parameters): + if verbose > 2: + print "Returned=Name: %s, Dir.: %s, Type: %s, Size: %s, Value: \"%s\", Precision: %s, NumericScale: %s" % \ + (p.Name, adc.directions[p.Direction], adc.adTypeNames.get(p.Type, str(p.Type)+' (unknown type)'), + p.Size, p.Value, p.Precision, p.NumericScale) + pyObject = _convert_to_python(p.Value,variantConversions[p.Type]) + if p.Direction == adc.adParamReturnValue: + self.returnValue = pyObject + else: + retLst.append(pyObject) + return retLst # return the parameter list to the caller def _reformat_operation(self,operation,parameters): if parameters: @@ -934,44 +931,40 @@ operation, parameters = self._namedToQmark(operation,parameters) return operation,parameters - def _buildADOparameterList(self, operation, parameters): + def _buildADOparameterList(self, operation, parameters, do_refresh=False): self.parameters = parameters self.cmd.CommandText = operation - if parameters != None: + + parameters_known = False + if do_refresh: # needed only if we are calling a stored procedure try: # attempt to use ADO's parameter list self.cmd.Parameters.Refresh() - self.parameters_known = True - except: # if it blows up - self.parameters_known = False - if not self.parameters_known: #-- build own parameter list - if verbose: - print('error in COM Refresh(), so adodbapi is building a parameter list') + parameters_known = True + except: + pass + + if parameters != None: + if parameters_known: # use ado parameter list + i = 0 |
From: <pyw...@li...> - 2013-06-13 08:29:24
|
changeset 606c6302d0df in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=606c6302d0df summary: configure adodbapi as 'binary' to prevent the eol extension complaining changeset 9cb6d1c727e7 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=9cb6d1c727e7 summary: Ignore PT_MV_TSTRING along with PT_TSTRING (Nick Czeczulin) changeset 1594b8c27383 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=1594b8c27383 summary: Get the exchange module (mostly) working in 64bit builds (Nick Czeczulin) diffstat: .hgeol | 4 +++ CHANGES.txt | 5 +++ com/win32comext/mapi/mapiutil.py | 2 +- com/win32comext/mapi/src/PyIExchangeManageStore.i | 1 + com/win32comext/mapi/src/exchange.i | 30 +++++++++++++++++++--- setup.py | 25 +++++++++++++------ 6 files changed, 54 insertions(+), 13 deletions(-) diffs (187 lines): diff -r 4ded0a838f8c -r 1594b8c27383 .hgeol --- a/.hgeol Mon Apr 29 10:01:40 2013 -0400 +++ b/.hgeol Thu Jun 13 18:29:09 2013 +1000 @@ -2,4 +2,8 @@ **.dsp = CRLF **.dsw = CRLF **.vbp = CRLF +# adodbapi appears to have been checked in with windows line endings +# and without the 'eol' extension enabled, so we say it's binary to stop +# hg continually thinking it has changed. +path:adodbapi = bin ** = native diff -r 4ded0a838f8c -r 1594b8c27383 CHANGES.txt --- a/CHANGES.txt Mon Apr 29 10:01:40 2013 -0400 +++ b/CHANGES.txt Thu Jun 13 18:29:09 2013 +1000 @@ -6,6 +6,11 @@ Since build 218: ---------------- + * win32com.mapi.exchange + Added 64-bit support by excluding the 32-bit Ex2kSdk.lib functions from 64-bit builds. + Unfortunately, this means that only IExchangeManageStore::CreateStoreEntryID + is currently available in a 64-bit build. (Nick Czeczulin) + * adodbapi updated to version 2.4.3 -- new examples folder includes short programs for reading and writing .xls spreadsheets and reading ACCESS .mdb files using SQL. New functions .is64bit.Python() and .is64bit.os() to help pick the correct drivers. diff -r 4ded0a838f8c -r 1594b8c27383 com/win32comext/mapi/mapiutil.py --- a/com/win32comext/mapi/mapiutil.py Mon Apr 29 10:01:40 2013 -0400 +++ b/com/win32comext/mapi/mapiutil.py Thu Jun 13 18:29:09 2013 +1000 @@ -72,7 +72,7 @@ # PT_TSTRING is a conditional assignment # for either PT_UNICODE or PT_STRING8 and # should not be returned during a lookup. - if name == 'PT_TSTRING': + if name in ['PT_TSTRING', 'PT_MV_TSTRING']: continue ptTable[value] = name diff -r 4ded0a838f8c -r 1594b8c27383 com/win32comext/mapi/src/PyIExchangeManageStore.i --- a/com/win32comext/mapi/src/PyIExchangeManageStore.i Mon Apr 29 10:01:40 2013 -0400 +++ b/com/win32comext/mapi/src/PyIExchangeManageStore.i Thu Jun 13 18:29:09 2013 +1000 @@ -10,6 +10,7 @@ %{ #include <edkmdb.h> #define INITGUID +#include <initguid.h> #define USES_IID_IExchangeManageStore #include <edkguid.h> %} diff -r 4ded0a838f8c -r 1594b8c27383 com/win32comext/mapi/src/exchange.i --- a/com/win32comext/mapi/src/exchange.i Mon Apr 29 10:01:40 2013 -0400 +++ b/com/win32comext/mapi/src/exchange.i Thu Jun 13 18:29:09 2013 +1000 @@ -28,16 +28,21 @@ #include "MAPIUTIL.H" #include "EDKMDB.H" -#include "EDKMAPI.H" -#include "EDKCFG.H" -#include "EDKUTILS.H" -#define INITGUID #define USES_IID_IExchangeManageStore #include <edkguid.h> #include "PyIExchangeManageStore.h" +%} +/* + Only include Ex2KSdk.lib functions for 32-bit builds. +*/ +#ifdef SWIG_PY32BIT +%{ +#include "EDKMAPI.H" +#include "EDKCFG.H" +#include "EDKUTILS.H" // What is the correct story here?? The Exchange SDK story sucks - it seems // certain functions in the stand-alone version are simply commented out. @@ -52,7 +57,10 @@ #if !defined(DONT_HAVE_MBLOGON) # include "MBLOGON.H" #endif +%} +#endif +%{ static int AddIID(PyObject *dict, const char *key, REFGUID guid) { PyObject *obiid = PyWinObject_FromIID(guid); @@ -67,11 +75,24 @@ %} + +// IExchangeManageStore::CreateStoreEntryId flags +#define OPENSTORE_USE_ADMIN_PRIVILEGE OPENSTORE_USE_ADMIN_PRIVILEGE +#define OPENSTORE_PUBLIC OPENSTORE_PUBLIC +#define OPENSTORE_HOME_LOGON OPENSTORE_HOME_LOGON +#define OPENSTORE_TAKE_OWNERSHIP OPENSTORE_TAKE_OWNERSHIP +#define OPENSTORE_OVERRIDE_HOME_MDB OPENSTORE_OVERRIDE_HOME_MDB + + %init %{ if ( PyCom_RegisterClientType(&PyIExchangeManageStore::type, &IID_IExchangeManageStore) != 0 ) return MODINIT_ERROR_RETURN; ADD_IID(IID_IExchangeManageStore); %} +/* + Only include Ex2KSdk.lib functions for 32-bit builds. +*/ +#ifdef SWIG_PY32BIT // @pyswig int, int|HrGetExchangeStatus|Obtains the current state of the server on a computer. // @rdesc The result is a tuple of serviceState, serverState HRESULT HrGetExchangeStatus( @@ -510,3 +531,4 @@ IMAPISession *INPUT, // @pyparm <o PyIMAPISession>|session||The MAPI session object IMAPIProp **OUTPUT ); +#endif /* SWIG_PY32BIT */ diff -r 4ded0a838f8c -r 1594b8c27383 setup.py --- a/setup.py Mon Apr 29 10:01:40 2013 -0400 +++ b/setup.py Thu Jun 13 18:29:09 2013 +1000 @@ -546,7 +546,7 @@ keyname = "SOFTWARE\Microsoft\Exchange\SDK" for root in _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER: try: - keyob = _winreg.OpenKey(root, keyname) + keyob = _winreg.OpenKey(root, keyname, 0, _winreg.KEY_READ | _winreg.KEY_WOW64_32KEY) value, type_id = _winreg.QueryValueEx(keyob, "INSTALLDIR") if type_id == _winreg.REG_SZ: sdk_install_dir = value @@ -562,7 +562,11 @@ kw.setdefault("library_dirs", []).insert(0, d) # The stand-alone exchange SDK has these libs - libs += " Ex2KSdk sadapi mapi32 netapi32" + if distutils.util.get_platform() == 'win-amd64': + # Additional utility functions are only available for 32-bit builds. + pass + else: + libs += " version user32 advapi32 Ex2KSdk sadapi netapi32" kw["libraries"] = libs WinExt_win32com.__init__(self, name, **kw) @@ -791,10 +795,11 @@ def _why_cant_build_extension(self, ext): # Return None, or a reason it can't be built. - # This kinda sucks, but I'm giving up on exchange support in 64bit - # builds. - if self.plat_name == 'win-amd64' and ext.name in ['exchange', 'exchdapi']: - return "Can't get exchange support working in 64bit builds" + # 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']: + return "No 64-bit library for utility functions available." include_dirs = self.compiler.include_dirs + \ os.environ.get("INCLUDE", "").split(os.pathsep) if self.windows_h_version is None: @@ -1345,6 +1350,10 @@ swig_cmd.extend(self.current_extension.extra_swig_commands) if not is_py3k: swig_cmd.append("-DSWIG_PY2K") + if distutils.util.get_platform() == 'win-amd64': + swig_cmd.append("-DSWIG_PY64BIT") + else: + swig_cmd.append("-DSWIG_PY32BIT") target = swig_targets[source] try: interface_parent = swig_interface_parents[ @@ -1932,12 +1941,12 @@ %(mapi)s/mapiutil.cpp %(mapi)s/mapiguids.cpp """ % dirs).split()), - WinExt_win32com_mapi('exchange', libraries="version user32 advapi32", + WinExt_win32com_mapi('exchange', libraries="mapi32", sources=(""" %(mapi)s/exchange.i %(mapi)s/exchange.cpp %(mapi)s/PyIExchangeManageStore.i %(mapi)s/PyIExchangeManageStore.cpp """ % dirs).split()), - WinExt_win32com_mapi('exchdapi', libraries="advapi32", + WinExt_win32com_mapi('exchdapi', libraries="mapi32", sources=(""" %(mapi)s/exchdapi.i %(mapi)s/exchdapi.cpp """ % dirs).split()), |
From: <pyw...@li...> - 2014-05-03 07:32:55
|
changeset 609dd1df35c5 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=609dd1df35c5 summary: fix a couple of build issues on earlier python versions changeset 1bf9216a6469 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=1bf9216a6469 summary: Add helper batch files used to build the world changeset 713ac73c22e5 in /hgroot/pywin32/pywin32 details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=713ac73c22e5 summary: Fix build problem, bump build number to 219, and more changes diffstat: CHANGES.txt | 21 +++++++++++++++++- build_all.bat | 42 ++++++++++++++++++++++++++++++++++++++ make_all.bat | 54 +++++++++++++++++++++++++++++++++++++++++++++++++ setup.py | 11 +++++++-- win32/src/win32evtlog.i | 2 + 5 files changed, 125 insertions(+), 5 deletions(-) diffs (204 lines): diff -r ebe979332110 -r 713ac73c22e5 CHANGES.txt --- a/CHANGES.txt Thu May 01 14:10:35 2014 -0600 +++ b/CHANGES.txt Sat May 03 17:32:59 2014 +1000 @@ -9,7 +9,8 @@ * win32com.mapi Addded outlook interface IConverterSession with methods MIMEToMAPI, MAPIToMIMEStm, and SetAdrBook Added method OpenStreamOnFile (Nick Czeczulin) - + Ignore PT_MV_TSTRING along with PT_TSTRING (Nick Czeczulin) + * Conversions from a Python object to a variant now does a better job at deciding what variant type to use, taking into account the size and sign of the value (Stefan Schukat via patch #127) @@ -32,8 +33,18 @@ * Fix issue implementing COM objects from within a virtualenv (Kevin Smyth via issue #3597965) +* Fix some issues using decimal objects with Python 3.3 and later (rupole) + +* Add a counterpart to VB's Nothing, from patch 3609027 by Stefan Schukat + +* win32api + Handle REG_QWORD (64-bit ints) (rupole) + Add GetEnvironmentVariableW and SetEnvironmentVariableW (rupole) + Fix function pointer check for win32api.GetNativeSystemInfo (bug#665) + * win32com.shell Add interfaces IFileOperation and IFileOperationProgressSink + Add SHParseDisplayName (feature req #3585998) (rupole) * win32com.propsys Add interfaces IPropertyChange, IPropertyChangeArray, and IObjectWithPropertyKey @@ -43,11 +54,17 @@ Add functions and objects for handling certificates and certificate stores * win32gui - Add RegisterHotKey + Add RegisterHotKey (rupole) * win32evtlog Add several more Evt* functions (Vista+ event log API) +* win32prociess + Add EnumProcessModulesEx (feature request 3608155) (rupole) + +* pythonwin + Fix a hang using the tools menu + Since build 217: ---------------- * mapiutil.py GetPropTagName has been modified to return the fully qualified diff -r ebe979332110 -r 713ac73c22e5 build_all.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build_all.bat Sat May 03 17:32:59 2014 +1000 @@ -0,0 +1,42 @@ +rem Sadly Python 2.5 requires an earlier MSSDK. +set mssdk=c:\mssdk\6.0 +py -2.5 setup.py -q build +@if errorlevel 1 goto failed + +rem And the rest work with 7.1 +set mssdk=c:\mssdk\7.1 +py -2.6-32 setup.py -q build +@if errorlevel 1 goto failed +py -2.6 setup.py -q build +@if errorlevel 1 goto failed +py -2.7-32 setup.py -q build +@if errorlevel 1 goto failed +py -2.7 setup.py -q build +@if errorlevel 1 goto failed +rem py3k +py -3.1-32 setup3.py -q build +@if errorlevel 1 goto failed +py -3.1 setup3.py -q build +@if errorlevel 1 goto failed +py -3.2-32 setup3.py -q build +@if errorlevel 1 goto failed +py -3.2 setup3.py -q build +@if errorlevel 1 goto failed +py -3.3-32 setup3.py -q build +@if errorlevel 1 goto failed +py -3.3 setup3.py -q build +@if errorlevel 1 goto failed +py -3.4-32 setup3.py -q build +@if errorlevel 1 goto failed +py -3.4 setup3.py -q build +@if errorlevel 1 goto failed +py -3.5-32 setup3.py -q build +@if errorlevel 1 goto failed +py -3.5 setup3.py -q build +@if errorlevel 1 goto failed + +goto xit +:failed +@echo Oops - failed! +goto xit +:xit \ No newline at end of file diff -r ebe979332110 -r 713ac73c22e5 make_all.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/make_all.bat Sat May 03 17:32:59 2014 +1000 @@ -0,0 +1,54 @@ +@if "%1"=="quick" goto quick +@if "%1"=="already_built" goto already_built +if exist build\. rm -rf build +if exist build\. goto couldnt_rm +cd autoduck +call make.bat +@if errorlevel 1 goto failed +cd .. +:quick +call build_all.bat +:already_built +rem Now the binaries. + +rem Yuck - 2to3 hackery - must nuke bdist dirs as it may hold py3x syntax. +if exist build/bdist.win32/. rm -rf build/bdist.win32 +if exist build/bdist.win-amd64/. rm -rf build/bdist.win-amd64 +py -2.7-32 setup.py -q sdist +py -2.6-32 setup.py -q bdist_wininst --target-version=2.5 --skip-build +py -2.6-32 setup.py -q bdist_wininst --target-version=2.6 --skip-build +py -2.6-32 setup.py -q bdist_wininst --target-version=2.6 --skip-build --plat-name=win-amd64 +py -2.7-32 setup.py -q bdist_wininst --target-version=2.7 --skip-build +py -2.7-32 setup.py -q bdist_wininst --target-version=2.7 --skip-build --plat-name=win-amd64 + +rem Just incase - re-nuke bdist dirs so 2to3 always runs. +if exist build/bdist.win32/. rm -rf build/bdist.win32 +if exist build/bdist.win-amd64/. rm -rf build/bdist.win-amd64 + +py -3.1-32 setup3.py -q bdist_wininst --target-version=3.1 --skip-build +py -3.1-32 setup3.py -q bdist_wininst --target-version=3.1 --skip-build --plat-name=win-amd64 + +py -3.2-32 setup3.py -q bdist_wininst --target-version=3.2 --skip-build +py -3.2-32 setup3.py -q bdist_wininst --target-version=3.2 --skip-build --plat-name=win-amd64 + +py -3.3-32 setup3.py -q bdist_wininst --target-version=3.3 --skip-build +py -3.3-32 setup3.py -q bdist_wininst --target-version=3.3 --skip-build --plat-name=win-amd64 + +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 + +rem And nuke the dirs one more time :) +if exist build/bdist.win32/. rm -rf build/bdist.win32 +if exist build/bdist.win-amd64/. rm -rf build/bdist.win-amd64 + +@goto xit +:couldnt_rm +@echo Could not remove the build directory! +goto xit +:failed +@echo Oops - failed! +goto xit +:xit \ No newline at end of file diff -r ebe979332110 -r 713ac73c22e5 setup.py --- a/setup.py Thu May 01 14:10:35 2014 -0600 +++ b/setup.py Sat May 03 17:32:59 2014 +1000 @@ -1,4 +1,4 @@ -build_id="218.5" # may optionally include a ".{patchno}" suffix. +build_id="219" # 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 @@ -544,9 +544,14 @@ sdk_install_dir = None libs = kw.get("libraries", "") keyname = "SOFTWARE\Microsoft\Exchange\SDK" + flags = _winreg.KEY_READ + try: + flags |= _winreg.KEY_WOW64_32KEY + except AttributeError: + pass # this version doesn't support 64 bits, so must already be using 32bit key. for root in _winreg.HKEY_LOCAL_MACHINE, _winreg.HKEY_CURRENT_USER: try: - keyob = _winreg.OpenKey(root, keyname, 0, _winreg.KEY_READ | _winreg.KEY_WOW64_32KEY) + keyob = _winreg.OpenKey(root, keyname, 0, flags) value, type_id = _winreg.QueryValueEx(keyob, "INSTALLDIR") if type_id == _winreg.REG_SZ: sdk_install_dir = value @@ -2562,7 +2567,7 @@ 'isapi/test/*.py', 'isapi/test/*.txt', 'adodbapi/*.txt', - 'adodbapi/test/*.py' + 'adodbapi/test/*.py', 'adodbapi/examples/*.py' ]) + # The headers and .lib files diff -r ebe979332110 -r 713ac73c22e5 win32/src/win32evtlog.i --- a/win32/src/win32evtlog.i Thu May 01 14:10:35 2014 -0600 +++ b/win32/src/win32evtlog.i Sat May 03 17:32:59 2014 +1000 @@ -1742,7 +1742,9 @@ #define EvtChannelPublishingConfigClockType EvtChannelPublishingConfigClockType #define EvtChannelPublishingConfigSidType EvtChannelPublishingConfigSidType #define EvtChannelPublisherList EvtChannelPublisherList +#ifdef EvtChannelPublishingConfigFileMax // this is only in SDK versions 7 and up #define EvtChannelPublishingConfigFileMax EvtChannelPublishingConfigFileMax +#endif #define EvtChannelConfigPropertyIdEND EvtChannelConfigPropertyIdEND // Login type used with EvtOpenSession |