Taglib Qt 读取访问冲突

Taglib Qt read access violation

似乎当您尝试从 taglib 中的 mp3 中获取评级并且打开它时会导致读取访问冲突:

这是我的代码:

QFile fileInfo(file);
fileInfo.open(QIODevice::ReadOnly);
if(fileInfo.isReadable())
{
    TagLib::MPEG::File mpeg(file.toStdString().c_str());
    bool isRead = mpeg.isReadable(file.toStdString().c_str());
    if(isRead)
        rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating();
}

我试过添加 try/catch 但还是失败了。我试过 QLockFile 但没有成功。有什么方法可以测试文件是否拥有文件的独占权限或捕获读取访问冲突?

更新 感谢提示,我修改了我的代码以首先检查无效值:

if(mpeg.ID3v2Tag() != 0)
{
    if(dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front()) != 0)
    {
        rating = dynamic_cast<TagLib::ID3v2::PopularimeterFrame *>(mpeg.ID3v2Tag()->frameList("POPM").front())->rating();
    }
}

读取访问冲突与文件读取无关,您的程序试图对其无法访问的内存进行读取访问。

在您的情况下,您正在尝试访问空指针 (0x0)。

你在最后一行代码中有两个指针访问操作,在尝试调用它们的方法之前检查它们都不是空指针

由于您在 this question 中的代码,您遇到了这个问题。您正在以错误的方式创建 POPM 框架,然后转换失败。

注意: dynamic_cast 是一个已检查的转换类型。失败时它 return 为零,就像这里一样。在假设它有效之前,您需要检查 return 值(否则您通常会使用 static_cast)。