IWICImagingFactory::CreateDecoderFromFilename() 即使在解码器被销毁后,也
IWICImagingFactory::CreateDecoderFromFilename() keeps the file locked even after the decoder is destroyed
我只用IWICImagingFactory::CreateDecoderFromFilename()
阅读。有没有办法传递像FILE_SHARE_READ
标志这样的东西?该文件从上面的函数调用中保持打开状态,直到程序终止。
在同一程序内的另一个操作中,我尝试使用CFile::Open()
,但出现错误32("进程无法访问该文件,因为它正被另一个进程使用"(。
我最终做的是使用
pImagePoolEntry->hFileHandle = CreateFile(
path.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
在呼叫CreateDecoderFromFilename()
之前。
由于我已经使用图像池来跟踪打开的共享图像,因此我只是添加了初始文件句柄,并添加了在图像不再使用时要使用的代码CloseHandle()
。
我不确定IWICBitmapDecoder
如何处理该文件,但它似乎在Release()
调用它之后保持打开状态。它可能有一个句柄未关闭的错误,谁知道呢。我找不到有关这种行为的任何信息。实际上,除了这个问题,似乎没有人注意到(或者没有人关心(。
无论如何,正如托尼所暗示的那样,解决方案是手动打开文件并使用CreateDecoderFromFileHandle()
而不是CreateDecoderFromFilename()
。请注意,"文件句柄在解码器的生存期内必须保持活动状态"。
所以这个:
void f(IWICImagingFactory* factory, const wchar_t* path)
{
IWICBitmapDecoder* decoder = nullptr;
factory->CreateDecoderFromFilename(
path, nullptr, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &decoder);
// ...
decoder->Release();
}
变成这样:
void f(IWICImagingFactory* factory, const wchar_t* path)
{
auto h = CreateFileW(
path, GENERIC_READ, FILE_SHARE_READ,
nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
IWICBitmapDecoder* decoder = nullptr;
factory->CreateDecoderFromFileHandle(
reinterpret_cast<ULONG_PTR>(h), nullptr,
WICDecodeMetadataCacheOnLoad, &decoder);
// ...
decoder->Release();
CloseHandle(h);
}
相关文章:
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 如何从WIC解码器确定自上而下/自下而上?
- 无法在 HEVC 解码器上设置输出类型 IMFTransform
- 连接无线电流和 MP3 解码器
- h264_cuvid编解码器未找到
- C++17 编解码器在将标准::字符串转换为标准::字符串时抛出"bad conversion"
- 如何使用 ffmpeg 将 3840 nb_samples编码为请求 1024 的编解码器
- FFMPEG:为什么当我调用av_codec_next()时,我所有的编解码器都没有显示出来
- OpenCV 检查计算机上是否安装了视频编解码器 (C++)
- FFMPEG 解码器似乎会丢帧
- 直接显示通用媒体解码器
- OpenCV:FFMPEG:编解码器 ID 12 和格式 'mp4 / MP4 不支持标记
- 带有 H264 编解码器的 libav 错误消息。"非严格单调PTS"
- C++ 文本消息解码器脚本 编译器 "expects unqualified id" 之前 if 和 else 语句
- 为什么编解码器X264/X265忽略了输入框架的PT和DTS
- 如何修复"UnicodeDecodeError:"utf-8"编解码器无法解码字节时使用Python C扩展?
- IWICImagingFactory::CreateDecoderFromFilename() 即使在解码器被销毁后,也
- 致命的Python错误:Py_Initialize:无法加载文件系统编解码器&ModuleNotFoundError
- C++ avformat_open_input返回空编解码器、宽度和高度
- 超级强大-导出到文件与混合器和解码器问题(不同的sampleRates和samplesPerFrame)