none
VB2008 使用 winmm.dll 時,若將CPU平台目標改成x86後,就會發生無聲音的問題 RRS feed

  • 問題

  • 小弟我使用這篇 http://social.msdn.microsoft.com/Forums/zh-TW/de9b5563-2e0a-4f8b-849c-806335fcc834/vb2008 文章小歐所解答的程式碼如下,近日發現一個問題,就是若將平台目標設為x86時,執行後卻沒有聲音,改回 AnyCPU 就有聲音,但因為我程式裡面需用到access,因此改用x86平台就不會出現 'Microsoft.Jet.OLEDB.4.0' 提供者並未登錄於本機電腦上 這個錯誤,也因為此做法導致播放音月時會出現無聲音的現象,想請教各位先進能不能解決在x86平台上無聲音的問題?

    所使用軟體:VB2008、作業系統Windows 7

    我的做法:將下列程式碼貼到VB2008,然後創1個開關,去該專案的屬性>編譯>進階編譯選項,將[目標CPU ]這個選項都各使用x86與AnyCPU測試一遍,結果就發生上述的問題(若將平台目標設為x86時,執行後卻沒有聲音,改回 AnyCPU 就有聲音)。

    謝謝

    Public Class Form1
        ' 宣告 API    
        Private Declare Function mciSendStringA Lib "winmm.dll" _
            (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, _
             ByVal uReturnLength As Integer, ByVal hwndCallback As Integer) As Integer
    
        Private Function PlayMidiFile(ByVal MusicFile As String) As Boolean
            mciSendStringA("stop music", "", 0, 0)
            mciSendStringA("close music", "", 0, 0)
            mciSendStringA("open " & MusicFile & " alias music", "", 0, 0)
            PlayMidiFile = mciSendStringA("play music", "", 0, 0) = 0
        End Function
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            PlayMidiFile("http://music.baby611.com/music/bd/dushuhao.mp3") ' 播放 MP3 音樂  
        End Sub
    End Class



    • 已編輯 神的奇蹟 2013年8月8日 上午 06:23 打錯字
    2013年8月8日 上午 06:19

解答

所有回覆

  • 在你的作業系統中會有兩個 winmm.dll

    一個是 X64 (在 Windows\System32)

    一個是 X86 (在 Windows\SysWOW64)

    你的程式可能是呼叫到 X64 那一個, 因為  X86 和 X64 的行程不能互相呼叫.

    試著把 Windows\SysWOW64 下的那個 DLL 複製一份和你的 exe 放在同一個目錄試試看


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年8月8日 上午 06:43
    版主
  • 您可以參考這篇討論, 解決 'Microsoft.Jet.OLEDB.4.0' 提供者並未登錄於本機電腦的錯誤, 就不需要切成x86模式了:The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine
    2013年8月8日 上午 06:45
  • 請問樓主, 這個問題目前的狀況如何呢 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2013年8月14日 上午 01:52
    版主
  • 版主你好

    若將平台設為X86,並且採用你說的方式將檔案分別複製一份至(\bin\x86\Debug)資料夾底下,然後用偵錯模擬測試後,結果還是無聲,因此這個方法暫不可行。

    --------------------------------------------------------------------------

    以下方法還未測試,但有疑問。

    關於另一位 this 先生所說的,該網址內容提到將原本 'Microsoft.Jet.OLEDB.4.0' 換成 'Microsoft.ACE.OLEDB.12.0' ,然後採用AnyCPU去執行後,因為會出現(microsoft.ace.oledb.12.0' 提供者並未登錄於本機電腦上)這錯誤,所以還要下載(AccessDatabaseEngine)這項才不會出現該錯誤。

    我是還沒安裝(AccessDatabaseEngine),因為並不是每台電腦都會安裝那個東西,但我想請問若最後將程式封裝時,能將(AccessDatabaseEngine)打包進去嗎?

    若可以該怎麼打包進去,才能使在安裝程式時,順便安裝(AccessDatabaseEngine)。

    --------------------------------------------------------------------------

    最近我有想到另一個方法,在網路上找不到這類的語法,就是能不能在呼叫 winmm.dll 的時候,指定呼叫 X86 的 winmm.dll 檔案 或者 X64 的 winmm.dll 檔案呢?

    謝謝

    2013年8月22日 下午 02:28
  • 2013年8月23日 上午 03:21
  • 最後的解決方式,是採用 Microsoft.ACE.OLEDB.12.0 的連線字串,以及平台目標設為 AnyCPU,並且安裝 AccessDatabaseEngine 即可。

    在此感謝 版主 與 this 的相助,得以讓我完成這次難題。

    2013年9月24日 上午 02:53