鉴于mp3文件的路径,
如何创建和初始化IPropertyStore对象以对该文件的元数据进行操作?
具体来说,我如何从这里获得:
"C:\\Music\\Viva Las Vegas.mp3"
到这里:
store->GetValue(PKEY_Music_AlbumArtist, &variant);
这里有一些伪代码,以帮助澄清我正在尝试做的事情:
#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仅限于许多可能字段的一小部分,我希望能够访问所有这些字段。
我最关心的字段是Album Artist,因为Windows Media Player将其用作默认排序顺序,无法更改。
我修改了TagLib来源以访问专辑艺术家而不是贡献艺术家(通过将所有出现的'\ 251ART'更改为'\ 141ART'),但它不起作用。
我确信有一种方法可以用ID3标签完成所有工作,但我宁愿不依赖TagLib,ZLIB和CMake工具等额外的东西。我想使用IPropertyStore,因为它是内置的,如果我能克服这个障碍,它似乎是最简单的方法。
我在网上找到了一些IPropertyStore的例子,我试图按摩它们以满足我的需要而没有任何运气,我仍然感到神秘。
MSDN“帮助”没有一点帮助 - 没有规格,没有示例 - 它甚至没有告诉我要包含哪个头文件。 MSDN帮助现在与以前相比很糟糕,或者我错过了什么?没有谷歌,我会被搞砸。无论如何...
我希望有人可以用3或4行代码向我展示如何为我的目的创建和初始化IPropertyStore。提前谢谢。
答案 0 :(得分:4)
以下是答案:
#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()
答案 1 :(得分:2)
简单地说,SHParseDisplayName获取可以提供给SHGetPropertyStoreFromIDList的PIDL
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762236(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/bb762196(v=vs.85).aspx