2013-04-17 4 views
0

저는 약간의 연습을 위해 간단한 프로그램을 작성하려고합니다. 그러나 Windows SDK 용 iTunes COM은 나에게 조금 놀랐습니다. 재생 목록을 만들고 파일을 추가하려고하지만 액세스 위반으로 IITUserPlaylist :: AddFile 프로그램이 중단되면 호출하려고합니다. 내가 IITLibraryPlaylist :: AddFile 호출하는 경우 http://www76.zippyshare.com/v/34795637/file.htmlWindows 용 iTunes SDK SDK IITUserPlaylist :: AddFile 액세스 위반

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

}

모두 옳았다 : 나는 모든 다른 방법 등

프로젝트 (MSVC10) 삭제하고자 할 수 있습니다. 테스트 용으로 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);