2011-05-16 47 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