2011-05-16 51 views
1

我試圖將一個簡單的.mp3文件添加到iTunes庫,但當我調用AddFile()時,程序不斷崩潰。但是,當我調用get_Tracks()時,它返回一個有效的指針,所以我認爲指向IITLibraryPlaylist的指針是有效的。我究竟做錯了什麼?iTunes COM接口 - 無法將歌曲添加到庫

IiTunes* p_iTunes; 
IITLibraryPlaylist* p_Library; 
IITOperationStatus* status; 
IITTrackCollection* iTrackCollection; 

CoInitialize(0); 
if (FAILED(CoCreateInstance(CLSID_iTunesApp, NULL, CLSCTX_LOCAL_SERVER, IID_IiTunes, (PVOID *)&p_iTunes))){ 
    p_iTunes->Release(); 
    CoUninitialize(); 
} 
else{ 
    p_iTunes->get_LibraryPlaylist(&p_Library); 

    p_Library->get_Tracks(&iTrackCollection); // This works, so I suppose p_Library is valid.. 
    long trackCount = 0; 
    iTrackCollection->get_Count(&trackCount); 

    p_Library->AddFile(L"C:\\asd\asd.mp3",&status); // crashes here 
} 
+0

順便說一句,你有錯誤處理做錯了。如果'CoCreateInstance()'失敗'p_iTunes'將會爲空,因此調用'Release()'會導致程序崩潰。 – sharptooth 2011-05-16 12:51:10

回答

1

的問題是你通過WCHAR*而不是正確分配BSTRthat leads to undefined behavior

你應該首先分配BSTR使用SysAllocString()(不要忘記晚些時候發佈的字符串)或更好的使用包裝類像ATL::CComBSTR_bstr_t管理BSTR壽命。

+0

SysAllocString()做到了!謝謝。 – iakovos 2011-05-16 12:35:03

+0

@iakovos:不客氣,只是不要忘記隨後釋放該字符串,否則會泄漏內存。 – sharptooth 2011-05-16 12:37:48