2011-12-25 91 views
2

給定mp3文件的路徑,如何使用IPropertyStore在Windows中使用C++訪問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僅限於很多可能字段的一小部分,我想要訪問它們。

我最關心的領域是專輯藝術家,因爲Windows Media Player使用它作爲默認排序順序,無法更改。

我修改了TagLib源代碼來訪問專輯藝術家而不是貢獻藝術家(通過將所有出現的'\ 251ART'改爲'\ 141ART'),但它不起作用。我確信有一種方法可以用ID3標籤完成所有事情,但我寧願不依賴像TagLib,ZLIB和CMake工具這樣的額外工具。我想使用IPropertyStore,因爲它是內置的,如果我能克服這個障礙,它似乎是最簡單的方法。

我在網上找到了一些IPropertyStore的例子,我試着按摩它們以適應我的需要,但沒有任何運氣,我仍然很困惑。

MSDN「幫助」毫無幫助 - 沒有規範,沒有示例 - 它甚至不告訴我要包含哪個頭文件。與之前的版本相比,MSDN幫助非常可怕,或者我錯過了什麼?沒有谷歌我會被搞砸。無論如何...

我希望有人能夠在3或4行代碼中顯示我如何爲我的目的創建和初始化IPropertyStore。提前致謝。

回答

3

這裏的答案:

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

由於洛根CAPALDO指着我在正確的方向。當我找到時,我並不需要這2個功能

SHGetPropertyStoreFromParsingName()