Hvordan bruger jeg IPropertyStore til at få adgang til mp3-metadata i Windows med C ++?

Indlæg af Hanne Mølgaard Plasc

Problem



På grund af stien til en mp3-fil,


Hvordan opretter og initialiserer jeg et IPropertyStore-objekt for at fungere på metadataene i den fil?


Nærmere bestemt, hvordan kommer jeg herfra:


"C:\Music\Viva Las Vegas.mp3"


til her:


store->GetValue(PKEY\_Music\_AlbumArtist, &variant);


Her er en pseudo-ish kode for at hjælpe med at præcisere, hvad jeg forsøger at gøre:


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


BAGGRUND


Måske er der et bedre sprog til at gøre dette, men jeg vil gerne bruge C ++ (det er en lang historie).


Oprindeligt efter at have undersøgt mp3 metadata, syntes det som om ID3 tags med TagLib var vejen at gå. Så jeg skrev et værktøj, der fungerede fint på et par felter. Men så fandt jeg ud af, at TagLib er begrænset til en lille delmængde af de mange mulige felter, og jeg vil have adgang til dem alle.


Det felt jeg er mest bekymret over er Album Artist, fordi Windows Media Player bruger det som standard sorteringsrækkefølge, som ikke kan ændres.


Jeg ændrede TagLib-kilden for at få adgang til Album-kunstneren i stedet for den bidragende kunstner (ved at ændre alle forekomster af '\ 251ART' til '\ 141ART'), men det virkede ikke.


Jeg er sikker på, at der er en måde at alt kan gøres med ID3-tags, men jeg vil hellere ikke stole på ekstra ting som TagLib, ZLIB og CMake-anlægget. Jeg vil bruge IPropertyStore fordi den er indbygget, og det virker som den enkleste måde, hvis jeg bare kan komme over denne forhindring.


Jeg har fundet et par eksempler på IPropertyStore på nettet, og jeg har forsøgt at massere dem, så de passer til mine behov uden held, jeg er stadig mystificeret.


MSDN 'Hjælp' er ikke den mindste nyttige - ingen specifikationer, ingen eksempler - det fortæller mig ikke selv, hvilken headerfil der skal medtages. MSDN Hjælp er forfærdelig nu sammenlignet med hvad det plejede at være, eller mangler jeg noget? Uden Google bliver jeg skruet. Anyway ...


Jeg håber, at nogen kan vise mig i 3 eller 4 linjer kode, hvordan man opretter og initialiserer IPropertyStore til mit formål. Tak på forhånd.

Bedste reference


Her er svaret:


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


Tak til Logan Capaldo for at pege mig i den rigtige retning. Jeg havde ikke brug for disse 2 funktioner, da jeg fandt


SHGetPropertyStoreFromParsingName()

Andre referencer 1


Kort sagt, SHParseDisplayName for at få en PIDL, du kan give til SHGetPropertyStoreFromIDList


http://msdn.microsoft.com/en-us/library/windows/desktop/bb762236(v=vs.85).aspx[6]


http://msdn.microsoft.com/en-us/library/windows/desktop/bb762196(v=vs.85).aspx[7]