2013-04-17 24 views
0

我只是嘗試編寫一些練習的簡單程序。但是iTunes SDK for Windows SDK讓我有點驚訝。 我想要創建播放列表並添加文件,但是當我調用IITUserPlaylist :: AddFile程序崩潰與訪問衝突。我所有其他的方法,如刪除等用於Windows SDK的iTunes COM IITUserPlaylist :: AddFile訪問衝突

項目(MSVC10):http://www76.zippyshare.com/v/34795637/file.html

#include <iostream> 
#include <windows.h> 
#include <comutil.h> 
#include "iTunesCOMInterface.h" 

int main(int argc, char* argv[]) 
{ 
CoInitialize(0); 

HRESULT hRes; 
IiTunes* itunes = 0; 

// note - CLSID_iTunesApp and IID_IiTunes are defined in iTunesCOMInterface_i.c 
hRes = ::CoCreateInstance(CLSID_iTunesApp, NULL, CLSCTX_LOCAL_SERVER, IID_IiTunes, (PVOID *)&itunes); 
if(hRes != S_OK && itunes == nullptr) 
{ 
    std::cout << "Can not create iTunesApp instance" << std::endl; 
    CoUninitialize(); 
    return 1; 
} 

IITLibraryPlaylist* mainLibrary = 0; 
hRes = itunes->get_LibraryPlaylist(&mainLibrary); 
if(hRes != S_OK || mainLibrary == 0) 
{ 
    std::cout << "Can not get main library" << std::endl; 

    itunes->Release(); 
    CoUninitialize(); 
    return 1; 
} 


IITSource* mainLibrarySource = 0; 
hRes = itunes->get_LibrarySource(&mainLibrarySource); 
if(hRes != S_OK || mainLibrarySource == 0) 
{ 
    std::cout << "Can not get library source" << std::endl; 

    mainLibrary->Release(); 
    itunes->Release(); 
    CoUninitialize(); 
    return 1; 
} 

IITPlaylistCollection* playlistCollection = 0; 
hRes = mainLibrarySource->get_Playlists(&playlistCollection); 
if(hRes != S_OK || playlistCollection == 0) 
{ 
    std::cout << "Can not get source playlists" << std::endl; 

    mainLibrarySource->Release(); 
    mainLibrary->Release(); 
    itunes->Release(); 
    CoUninitialize(); 
    return 1; 
} 

BSTR playlistName = SysAllocString(L"SoundFrost playlist"); 

IITPlaylist* ownPlaylist = 0; 
//TODO: But there can be additional playlists with the same name, since playlist names are not unique 
hRes = playlistCollection->get_ItemByName(playlistName, &ownPlaylist); 
if(hRes != S_OK || ownPlaylist == 0) 
{ 
    //just create new 
    hRes = itunes->CreatePlaylist(playlistName, &ownPlaylist); 
    if(hRes != S_OK || ownPlaylist == 0) 
    { 
     std::cout << "Can not create playlist"; 

     SysFreeString(playlistName); 

     playlistCollection->Release(); 
     mainLibrarySource->Release(); 
     mainLibrary->Release(); 
     itunes->Release(); 
     CoUninitialize(); 
     return 1; 
    } 
} 
SysFreeString(playlistName); 

ITPlaylistKind playlistKind; 
hRes = ownPlaylist->get_Kind(&playlistKind); 
if(hRes == S_OK && playlistKind == ITPlaylistKindUser) 
{ 
    IITUserPlaylist* ownUserPlaylist = static_cast<IITUserPlaylist*>(ownPlaylist); 
    if(ownUserPlaylist != 0) 
    { 
     BSTR filePath = SysAllocString(L"C:\\test.mp3"); 
     IITOperationStatus* status; 
     //hRes = mainLibrary->AddFile(filePath, &status); 
     //hRes = ownUserPlaylist->AddFile(filePath, &status); 
     SysFreeString(filePath); 
    } 
} 

playlistCollection->Release(); 
ownPlaylist->Release(); 
mainLibrarySource->Release(); 
mainLibrary->Release(); 
itunes->Release(); 

CoUninitialize(); 

return 0; 

}

如果我叫IITLibraryPlaylist :: AddFile萬事大吉。 只需取消95或96行的測試註釋。

簡單的C#代碼工作正常:

iTunesApp itunes = new iTunesLib.iTunesApp(); 
IITUserPlaylist playlist = itunes.CreatePlaylist("C# playlist") as IITUserPlaylist; 
IITOperationStatus status = playlist.AddFile("C:\\test.mp3"); 

我不明白爲什麼會這樣。

+1

你不能施放一個接口指針到另一個接口指針(IITUserPlaylist *),你*必須*做一個QueryInterface。 –

+0

哦,我忘了這件事。非常感謝你! :) – silverrulezz

回答

1

你不能真正做到這一點與COM:

IITUserPlaylist* ownUserPlaylist = static_cast<IITUserPlaylist*>(ownPlaylist); 

你只是鑄造一個接口指針到另一個接口指針。你必須做一個QueryInterface代替:

HRESULT hr = ownPlaylist->QueryInterface(IID_IITUserPlaylist, (void**)&ownUserPlaylist);