【问题标题】:iTunes COM interface - Cannot add song to libraryiTunes COM 接口 - 无法将歌曲添加到资料库
【发布时间】:2011-05-16 12:10:51
【问题描述】:

我正在尝试将一个简单的 .mp3 文件添加到 iTunes 库,但是当我调用 AddFile() 时,我的程序不断崩溃。但是,当我调用 get_Tracks() 时,它返回一个有效指针,所以我认为指向 IITLibraryPlaylist 的指针是有效的。我做错了什么?

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
}

【问题讨论】:

  • 顺便说一句,您错误处理错误。如果CoCreateInstance() 失败,p_iTunes 将为 null,因此调用 Release() 将使您的程序崩溃。

标签: c++ com interface itunes


【解决方案1】:

问题是您传递了WCHAR* 而不是正确分配的BSTRthat leads to undefined behavior

您应该首先使用SysAllocString() 分配一个BSTR(不要忘记稍后释放字符串),或者最好使用ATL::CComBSTR_bstr_t 之类的包装类来管理BSTR 的生命周期。

【讨论】:

  • @iakovos:不客气,只是不要忘记稍后释放该字符串,否则会泄漏内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2022-12-01
  • 2013-03-13
  • 2010-12-07
  • 1970-01-01
  • 2010-11-22
相关资源
最近更新 更多