C++ 如何使用IPropertyStore在使用C+的Windows中访问mp3元数据+;?
给定mp3文件的路径 如何创建和初始化IPropertyStore对象以对该文件的元数据进行操作? 具体来说,我如何从这里开始: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
"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()