给定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);
}

背景

也许有一种更好的语言可以做到这一点,但是我想使用C++(这是一个很长的故事)。

最初,在研究了mp3元数据之后,采用TagLib的ID3标签似乎是必经之路。因此,我编写了一个在两个领域都可以正常工作的实用程序。但是后来我发现TagLib仅限于许多可能字段的一小部分,我想访问所有这些字段。

我最关心的字段是“专辑艺术家”,因为Windows Media Player将其用作无法更改的默认排序顺序。

我修改了TagLib源,以访问专辑艺术家而不是贡献者艺术家(通过将所有出现的'\251ART'更改为'\141ART'),但是它没有用。

我敢肯定,有一种方法可以使用ID3标签完成所有工作,但我宁愿不依赖于TagLib,ZLIB和CMake工具之类的多余东西。我想使用IPropertyStore,因为它是内置的,这似乎是最简单的方法,如果我能克服这个障碍。

我在网上找到了一些IPropertyStore的示例,但我一直在努力地按摩它们以适应我的需求,但没有任何运气,但我仍然感到困惑。

MSDN“帮助”一点也不有用-没有规范,没有示例-它甚至没有告诉我要包含哪个头文件。与以前相比,MSDN帮助现在很糟糕,还是我错过了什么?没有Google,我会被搞砸。反正 ...

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

最佳答案

答案是:

#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();
}

感谢Logan Capaldo 向我指出正确的方向。当我发现时我不需要那两个功能
SHGetPropertyStoreFromParsingName()

10-04 14:41