【问题标题】:Taglib Qt read access violationTaglib Qt 读取访问冲突
【发布时间】:2017-01-02 06:48:17
【问题描述】:

似乎当您尝试从 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();
    }
}

【问题讨论】:

    标签: qt taglib


    【解决方案1】:

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

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

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

    【讨论】:

    • 有什么好的方法来拆分它。当我第一次尝试 TagLib::ID3v2::Tag *id3v2 = mpeg.ID3v2Tag();我得到 id3v2 是未声明的标识符
    • 奇怪,如果Tag 是命名空间TagLib::ID3v2 中的有效类型,这对我来说似乎有效
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-17
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多