adding python-win32 to the rest of the thread... I missed a reply-all in here somewhere...
On Dec 19, 2011, at 5:06 PM, Scott Leerssen wrote: > > On Dec 19, 2011, at 5:01 PM, Mark Hammond wrote: > >> Note you are also closing h. But more generally, I wouldn't be at all >> surprised to find that closing fd also closes the win32 handle associated >> with it, otherwise every CRT handle ever opened would leak the OS handle. > > It does close the descriptor. However, I still see screwy behavior with > other sockets and descriptors in other threads. It's almost like there are > two sides of the descriptor, and one gets reused before the other is > released, resulting in unexpected closure of descriptors or "stealing" of one > threads descriptor when another thread opens a file or socket. It is truly > odd. > >> IOW, I think you can just detach it and ignore closing it. >> >> Mark >> >> On 20/12/2011 8:43 AM, Scott Leerssen wrote: >>> >>> On Dec 19, 2011, at 4:32 PM, Mark Hammond wrote: >>> >>>> On 18/12/2011 4:34 AM, Scott Leerssen wrote: >>>>> >>>>> On Dec 17, 2011, at 12:25 PM, Amaury Forgeot d'Arc wrote: >>>>> >>>>>> 2011/12/17 Scott Leerssen<sleers...@gmail.com >>>>>> <mailto:sleers...@gmail.com>> >>>>>> >>>>>> I did see that, but I interpreted that to mean that the PyHANDLE >>>>>> would be dereferenced from the underlying Windows file handle, >>>>>> >>>>>> >>>>>> It's the other way round: the PyHandle just forgets the win32 handle >>>>>> value, and will not close it in its __del__. >>>>> >>>>> Sorry, I did write that backward. How is the win32 handle freed? >>>> >>>> The .Detach() method returns an integer handle value which can then be >>>> closed using win32api.CloseHandle(). >>> >>> I just tried that, and after closing the file object and attempting to call >>> win32api.ClosHandle() on the value returned by detach, I get an exception >>> of "error: (6, 'CloseHandle', 'The handle is invalid.')" Here's what the >>> code looks like: >>> >>> h = win32file.CreateFile( >>> fname, >>> win32file.GENERIC_READ, >>> win32file.FILE_SHARE_READ, >>> None, >>> win32file.OPEN_EXISTING, >>> win32file.FILE_FLAG_BACKUP_SEMANTICS, >>> None >>> ) >>> hd = h.Detach() >>> fd = msvcrt.open_osfhandle(hd, os.O_RDONLY) >>> f = os.fdopen(fd, 'rb') >>> f.read() >>> f.close() >>> h.Close() >>> win32file.CloseHandle(hd) >>> >>> >> > _______________________________________________ python-win32 mailing list python-win32@python.org http://mail.python.org/mailman/listinfo/python-win32