首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何关闭在Python / pythoncom /comtype中打开的Windows Portable Device IStream

如何关闭在Python / pythoncom /comtype中打开的Windows Portable Device IStream
EN

Stack Overflow用户
提问于 2018-05-31 02:08:28
回答 1查看 150关注 0票数 0

我正在使用带有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的支持。

EN

回答 1

Stack Overflow用户

发布于 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 ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50611009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档