2013-03-01 59 views
1

我想讓自己適應Qt5,所以我開始了一個非常小的MP3播放器。它編譯在Linux和Windows 7上,都是64位。當QtCreator啓動時,QMediaPlayer無法在Windows上啓動播放功能

在Windows上運行時,只有當我在QtCreator中啓動程序時,選定的mp3文件纔會開始播放。當我開始獨立(共享編譯)的EXE時,程序打開,但開始播放什麼都沒有發生(當在IDE內部調試時,一切似乎都有效,我想是有點像Heisenbug)。

當看文件訪問Processmonitor我看到目錄掃描,但是當MP3應該打開什麼都沒有發生。

也許我錯過了複製一個DLL,但是我沒有提示哪一個缺失,所以它可能是另一個問題。 的Dependency Walker輸出(儘管它並沒有告訴我哪些文件/ funcionts導致的錯誤,也許我錯過了):

Error: At least one module has an unresolved import due to a missing export function in an implicitly dependent module. 
Error: Modules with different CPU types were found. 
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. 

這是從哪兒我嘗試啓動EXE

    我的目錄內容
  • 文件夾 「平臺」,包括:qminimal.dll,qwindows.dll
  • icudt49.dll,icuin49.dll,icuuc.49.dll
  • IEShims.dll(工程沒有它,但是Dependency Walker中告訴其丟失)
  • libEGL.dll
  • libgcc_s_sjlj-1.DLL
  • libGLESv2.dll
  • 的libstdC++ - 6.dll
  • libwinpthread-1.DLL
  • Qt5Core.dll,Qt5Gui.dll,Qt5Multimedia.dll ,Qt5Network.dll,Qt5Widgets.dll
  • purr.exe

你可以看一下完整的源@https://github.com/VashSan/purr - 源代碼WH的一部分我開始播放:

void PurrWindow::playMedia() 
{ 
    // [...] 
    // QMediaPlayer is a member of PurrWindow: 

    QUrl media = QUrl::fromLocalFile(selectedFile); 
    player.setMedia(media); 
    player.play(); 
} 

我用MSVC2010編譯了一次程序,用Mingw編譯了一次沒有區別。

我試圖谷歌QMediaPlayer的錯誤,但其中大多數都與移動平臺有關。然而,它並沒有給我留下QMediaPlayer的良好印象,也許我應該看看更可靠的播放庫。但是,如果它只是開始播放,我會很高興。

+0

不Qt的節目'selectedFile'顯示爲可訪問(即存在和可讀性)? – 2013-03-01 23:42:19

+0

它在我的電腦上用Qt5處理兩種情況msvc2010 – 2013-03-02 03:28:38

+0

@Vash請仔細檢查答案,併爲那些幫助你的人投票。您也可以點擊答案附近的複選框將其選爲您問題的正式答案。 – karlphillip 2013-03-21 17:25:06

回答

1

使用DLL Export Viewer找出如果你的.exe指的是正確的的.dll

有時,人們安裝了不止一個的Qt /聲子版本和PATH環境變量不指向哪裏這些DLL文件所在的目錄。

此外,請確保selectedFile具有文件的完整路徑。這是一個好主意,檢查路徑是否有效後:

selectedFile = fileDialog.getSelectedPath(); 

有:

QFile file(selectedFile); 
if(!file.exists()) 
{ 
    qDebug() << "!!! Invalid file: " << selectedFile; 
    return; 
} 
+0

我認爲它缺少聲子的後端插件。因爲如果編譯時鏈接的dll不在路徑中,那麼exe就不會運行,事實並非如此。但對於運行時加載的插件,您將無法使用dll導出查看器查看它。 – 2013-03-02 01:42:29

+0

@MinLin感謝提示:我仔細看過所有無法加載進程監視器Qt5MultimediaWidgets.dll,Qt5OpenGL.dll,D3DCompiler_43.dll的DLL。現在它工作。如果您不想提供所有DLL,是否沒有其他方法可以找出哪些DLL是需要的?不幸的是,沒有「Qt Runtime」,如果缺少某些東西,可以將其重定向到:| – Alex 2013-03-02 03:39:47

+3

找到它的一種方法是,您在QtCreator中運行它,播放音樂以使任何運行時加載的dll準備就緒。然後使用工具listdlls(http://technet.microsoft.com/en-us/sysinternals/bb896656.aspx)查看exe加載了哪些dll。它會顯示所有加載的dll。 – 2013-03-02 03:49:50