黑马程序员技术交流社区

标题: 这类问题怎么解决啊 [打印本页]

作者: Doublekill    时间: 2014-3-16 22:00
标题: 这类问题怎么解决啊
本帖最后由 Doublekill 于 2014-3-18 22:18 编辑

这类问题怎么解决,视频出了个播放器,跟着做,就发现COM错误了,什么情况


作者: 鬼鬼    时间: 2014-3-16 22:29
楼主可以用try...catch...捕捉一下异常信息,输出一下看看到底是什么情况:
  1. try
  2. {
  3.     //出现异常部分
  4. }
  5. catch(Exception ex)
  6. {
  7.     Console.WriteLine(ex.Message);
  8.     //…………
  9. }
复制代码

作者: Doublekill    时间: 2014-3-16 23:16
鬼鬼 发表于 2014-3-16 22:29
楼主可以用try...catch...捕捉一下异常信息,输出一下看看到底是什么情况:

这是调用方法时候弹出的COM组件错误,用try -catch 框起来,就没意义了。这个是实现自动播放歌曲的功能
作者: 鬼鬼    时间: 2014-3-16 23:55
Doublekill 发表于 2014-3-16 23:16
这是调用方法时候弹出的COM组件错误,用try -catch 框起来,就没意义了。这个是实现自动播放歌曲的功能 ...

源码放上来吧……
作者: Max_骏    时间: 2014-3-17 11:46
这样子你看看行不行!!!用LoadLibrary函数装载控件库文件,然后用GetProAddress函数检索指定的动态库中输出的库函数地址,然后调用该库函数。以注册mp3play.ocx为例。在程序InitInstance( )函数中构造窗体前加入这段代码:HINSTANCE h;  
    h = ::LoadLibrary(_T("Mp3play.ocx"));  
    FARPROC pFunc = ::GetProcAddress((HMODULE)h,"DllRegisterServer");  
    if (pFunc==NULL)  
    {  
        ::MessageBox(NULL,_T("OCX控件加载失败!"),_T("错误"),MB_ICONERROR);  
        return FALSE;  
    }  
    pFunc();  
作者: Doublekill    时间: 2014-3-18 22:11
鬼鬼 发表于 2014-3-16 23:55
源码放上来吧……

代码太多了啊

作者: Doublekill    时间: 2014-3-18 22:15
鬼鬼 发表于 2014-3-16 23:55
源码放上来吧……

  private void axWp1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
        {
        //    lblook.Text += axWp1.playState.ToString() + "\n";
        //    if (lsongs.Count == 0)//集合里面没歌曲就不管它
        //    {
        //        return;
        //    }
           
            //如果播放器的状态为mediaEnded
            //if (axWp1.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
            //{
                //此时实现下一曲的选择,并为URL赋值
                //得到现在的序号
                //int temp = listSongsPlayer.SelectedIndex;
                //temp++;
                ////如果temp+1后比最后一个元素大
                //if (temp > lsongs.Count - 1)
                //{
                //    //lsp.stx中的元素和播放器的地址都从0开始
                //    listSongsPlayer.SelectedIndex = 0;
                //    axWp1.URL = lsongs[0];
                //}
                //else
                //{
                //    //播放地址从temp开始
                //    listSongsPlayer.SelectedIndex=temp;
                //    axWp1.URL=lsongs[temp];
                //}
                //axWp1.URL = lsongs[listSongsPlayer.SelectedIndex + 1 > lsongs.Count - 1 ? listSongsPlayer.SelectedIndex = 0 : ++listSongsPlayer.SelectedIndex];
            //}
            //if (axWp1.playState == WMPLib.WMPPlayState.wmppsReady)
            //{

            //    axWp1.Ctlcontrols.play();
            //}
        }
---这是playstate事件的代码
-  #region 用索引完成播放,并修改按钮显示
        private void myPlay(int i)
        {   
                axWp1.URL = lsongs;
                listSongsPlayer.SelectedIndex = i;
                axWp1.Ctlcontrols.play();
                btnPlay.Text = "暂停";//调用方法后会默认播放,所以这里的按钮要改成暂停
                str = "歌曲名:" + listSongsPlayer.SelectedItem.ToString();//处理歌曲长度.当调用播放方法时这里要写上
                IntLrc(axWp1.currentMedia.sourceURL);//把路径传给pathsong然后执行方法.当调用播放方法时这里要写上
        }
        private void myPlay()
        {
            myPlay(0);//默认从第一个播放
        }
        #endregion
--方法代码,这个问题就是一调方法出错
作者: Doublekill    时间: 2014-3-18 22:17
Max_骏 发表于 2014-3-17 11:46
这样子你看看行不行!!!用LoadLibrary函数装载控件库文件,然后用GetProAddress函数检索指定的动态库中输 ...

试过了,没效果,估计是电脑掉COM组件的时候,缺点东西




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2