Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用IPropertyStore在使用C+的Windows中访问mp3元数据+;?_C++_Windows_Mp3_Metadata - Fatal编程技术网

C++ 如何使用IPropertyStore在使用C+的Windows中访问mp3元数据+;?

C++ 如何使用IPropertyStore在使用C+的Windows中访问mp3元数据+;?,c++,windows,mp3,metadata,C++,Windows,Mp3,Metadata,给定mp3文件的路径 如何创建和初始化IPropertyStore对象以对该文件的元数据进行操作? 具体来说,我如何从这里开始: "C:\\Music\\Viva Las Vegas.mp3" 到这里: store->GetValue(PKEY_Music_AlbumArtist, &variant); 下面是一些伪ish代码,有助于澄清我试图做的事情: #include "stdafx.h" #include <propsys.h> #include <pr

给定mp3文件的路径

如何创建和初始化IPropertyStore对象以对该文件的元数据进行操作?

具体来说,我如何从这里开始:

"C:\\Music\\Viva Las Vegas.mp3"
到这里:

store->GetValue(PKEY_Music_AlbumArtist, &variant);
下面是一些伪ish代码,有助于澄清我试图做的事情:

#include "stdafx.h"
#include <propsys.h>
#include <propkey.h>

void main ()
{
    // property store must somehow represent the mp3 file
    IPropertyStore* store = "C:\\Music\\Viva Las Vegas.mp3"; // HELP!
    PROPVARIANT variant;

    // get the existing album artist
    store->GetValue(PKEY_Music_AlbumArtist, &variant);
    assert(variant== "Elvis Presley");

    // set it to something else
    variant= "ZZ Top";
    store->SetValue(PKEY_Music_AlbumArtist, variant);
}
#包括“stdafx.h”
#包括
#包括
空干管()
{
//属性存储必须以某种方式表示mp3文件
IPropertyStore*store=“C:\\Music\\Viva Las Vegas.mp3”//帮助!
前体变异体;
//获取现有的唱片艺术家
store->GetValue(PKEY\u Music\u AlbumArtister和变体);
断言(变量==“猫王”);
//把它设成别的
variant=“ZZ Top”;
存储->设置值(PKEY_Music_AlbumArtister,变体);
}
背景

也许有更好的语言来做这件事,但我想用C++(这是一个很长的故事)。 最初,在研究了mp3元数据之后,使用TagLib的ID3标签似乎是一种选择。所以我写了一个实用程序,它在几个领域都运行良好。但后来我发现TagLib仅限于许多可能字段的一小部分,我希望访问所有字段

我最关心的字段是Album Artister,因为Windows Media Player将其用作默认排序顺序,无法更改

我修改了TagLib源以访问相册艺术家而不是贡献艺术家(通过将所有出现的“\251ART”更改为“\141ART”),但它不起作用

我相信有一种方法可以用ID3标签完成所有事情,但我不想依赖额外的东西,比如TagLib、ZLIB和CMake工具。我想使用IPropertyStore,因为它是内置的,如果我能克服这个障碍,这似乎是最简单的方法

我在网上找到了一些IPropertyStore的例子,我试图在没有任何运气的情况下对它们进行按摩以满足我的需要,我仍然感到困惑

MSDN“Help”一点帮助都没有——没有规范,没有示例——它甚至没有告诉我要包含哪个头文件。MSDN帮助现在比以前更糟糕了,还是我遗漏了什么?没有谷歌,我就完蛋了。无论如何


我希望有人能用3到4行代码向我展示如何为我的目的创建和初始化IPropertyStore。提前感谢。

简单地说,SHParseDisplayName可以获得一个PIDL,您可以从idlist将其提供给SHGetPropertyStoreFromIDList

答案如下:

#include <shobjidl.h>   // SHGetPropertyStoreFromParsingName, etc
#include <propkey.h>    // PKEY_Music_AlbumArtist
#include <propvarutil.h>// InitPropVariantFromString, needs shlwapi.lib

void main() // error-checking removed
{
    // initialize the COM library
    CoInitialize(NULL);

    // get a property store for the mp3 file
    IPropertyStore* store = NULL;
    SHGetPropertyStoreFromParsingName(L"C:\\Music\\Viva Las Vegas.mp3", 
        NULL, GPS_READWRITE, __uuidof(IPropertyStore), (void**)&store);

    // get the existing album artist ("Elvis Presley")
    PROPVARIANT variant;
    store->GetValue(PKEY_Music_AlbumArtist, &variant);

    // set it to something else
    InitPropVariantFromString(L"ZZ Top", &variant);
    store->SetValue(PKEY_Music_AlbumArtist, variant);
    store->Commit();

    // very important undocumented method
    store->Release();
}
SHGetPropertyStoreFromParsingName()