Visual Studio中Windows Media Player音乐播放器的C2664错误解决
解决C++/CLI音乐播放器中AxWindowsMediaPlayer URL赋值的C2664错误
嘿,我看你在做学校的音乐播放器项目时遇到了类型转换的问题,这个错误其实是因为你对多选文件的变量类型处理错了,咱们一步步来解决:
首先,先明确你遇到的错误:
error C2664: 'AxWMPLib::AxWindowsMediaPlayer::URL::set' : cannot convert parameter 1 from 'wchar_t' to 'System::String ^'
问题根源
你现在声明的files和paths是单个String^类型,但当你启用文件多选时,需要用数组类型来存储所有选中的文件名和路径。原来的代码里,paths[listBox1->SelectedIndex]实际上是在取单个字符串的某个字符(wchar_t),而不是你想要的对应索引的文件路径,这就导致了类型不匹配的错误。
修复步骤
- 修正变量类型
把类里的files和paths声明改成数组类型:
array<String^>^ files; array<String^>^ paths;
- 正确获取多选文件信息
在btnOpen_Click方法里,要先设置Multiselect=true再弹出对话框,还要判断用户是否确认选择了文件,然后用SafeFileNames和FileNames获取数组形式的文件名和路径:
private: System::Void btnOpen_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog ^ open = gcnew OpenFileDialog(); open->Multiselect = true; // 先开启多选功能 if(open->ShowDialog() == System::Windows::Forms::DialogResult::OK) { files = open->SafeFileNames; // 获取所有选中文件的文件名数组 paths = open->FileNames; // 获取所有选中文件的完整路径数组 listBox1->Items->Clear(); // 清空列表,避免重复添加 for(int i=0; i < files->Length ; i++) { listBox1->Items->Add(files[i]); } } }
- 保留原有的列表选择事件逻辑
你的listBox1_SelectedIndexChanged方法逻辑是对的,现在paths是数组,paths[listBox1->SelectedIndex]会返回正确的String^类型路径,赋值给player->URL就不会再报错了:
private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e) { player->URL = paths[listBox1->SelectedIndex]; player->Ctlcontrols->play(); }
另外补充一点:原来的代码里你先调用了ShowDialog()再设置Multiselect=true,这顺序是反的,必须先开启多选再弹出对话框,否则多选功能不会生效。
内容的提问来源于stack exchange,提问作者Noobie983
相关产品推荐
相关产品推荐

