我正在使用带有pythoncom和comtype的python中的Windows便携设备。
我遇到了麻烦,因为当我请求WPD_RESOURCE_THUMBNAIL资源时,一些安卓设备返回一个“正方形”的缩略图,而原始图像是16:9格式(或4:3...)。
然后我尝试请求WPD_RESOURCE_DEFAULT资源,以便从EXIF数据中获得缩略图:所以不需要读取整个文件,一旦我获得缩略图的EXIF标签,我就可以停止读取并跳到下一个文件。
我可以从EXIF中得到第一个文件的缩略图。在第二个文件中,我被GetStream()方法卡住了。它只是简单地挂起。我想是因为上一次调用的IStream没有被关闭/释放。
你知道如何强制释放/关闭这个IStream吗?
这就是我在代码中做的事情:
optimalTransferSizeBytes, fileStream = resources.GetStream(
self.objectID,
WPD_RESOURCE_DEFAULT,
ctypes.c_ulong(0),
optimalTransferSizeBytes,
pFileStream
)
提前感谢您在这方面的任何建议。
编辑:因为我找不到其他方法来中断流并释放所有资源,所以我最终读取了WPD_RESOURCE_DEFAULT的整个流。它有点慢,但更安全,因为应用程序也可以在大屏幕上运行,并且使用EXIF的缩略图可能会导致屏幕上的图像质量很差。因此,我决定为此目的读取WPD_RESOURCE_DEFAULT的整个流,并在这一点之外的某个地方加速代码。感谢您@ShadowRanger的支持。
发布于 2018-05-31 02:24:28
UnmanagedMemoryStream
类型has a Dispose
method,如果你的库为你公开了所有的方法,那么一个简单的fileStream.Dispose()
就可以工作了。为安全起见,您可能希望实现一个上下文管理器包装器以允许使用with
语句,或者使用try
/finally
,例如:
optimalTransferSizeBytes, fileStream = resources.GetStream(
self.objectID,
WPD_RESOURCE_DEFAULT,
ctypes.c_ulong(0),
optimalTransferSizeBytes,
pFileStream
)
try:
... do stuff with fileStream ...
finally:
fileStream.Dispose()
或者,您可以使用make your own context manager to perform disposal
from contextlib import contextmanager
@contextmanager
def disposing(disposable):
try:
yield disposable
finally:
disposable.Dispose()
这将允许稍微更好的代码:
optimalTransferSizeBytes, fileStream = resources.GetStream(
self.objectID,
WPD_RESOURCE_DEFAULT,
ctypes.c_ulong(0),
optimalTransferSizeBytes,
pFileStream
)
with disposing(fileStream):
... do stuff with fileStream ...
https://stackoverflow.com/questions/50611009
复制相似问题