首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

VC++ 資源檔嵌入 WAV 聲音資源並播放完整指南

     編輯:VC 教學

將聲音檔 (如提示音、警報音) 直接編譯進 EXE 內部,避免部署時遺漏外部檔案,是專業軟體開發的常見需求。本文詳細說明如何在 VC++ 專案的 .rc 資源檔中加入 WAVE 資源,並透過獨立執行緒載入播放,附完整代碼範例。

一、 將 WAV 檔加入資源檔 (.rc)

  1. 用文字編輯器 (記事本) 開啟專案的 .rc 檔。
  2. 在檔案末尾加入一行資源定義,格式:資源ID 類型 檔案路徑
    IDW_WAVE  WAVE  "c:\sounds\notify.wav"
    • IDW_WAVE:自訂資源識別碼 (符號常數)。
    • WAVE:資源類型,必須大寫。
    • 路徑建議使用相對路徑或專案目錄下檔案。
  3. 儲存 .rc 檔,關閉編輯器。Visual Studio 會自動偵測變更。

二、 播放邏輯:獨立執行緒 + 資源載入 API

播放聲音可能阻塞 UI,建議用 AfxBeginThread 建立獨立執行緒。

1. 啟動播放執行緒

AfxBeginThread((AFX_THREADPROC)PlaySoundThread, NULL, THREAD_PRIORITY_NORMAL);

2. 執行緒回呼函數實現

UINT PlaySoundThread(LPVOID pParam) {
    // 1. 取得模組實例控制代碼
    HINSTANCE hInst = AfxGetInstanceHandle();

    // 2. 尋找資源
    // 參數:模組句柄、資源名稱 (MAKEINTRESOURCE 或字串)、資源類型
    HRSRC hRes = FindResource(hInst, _T("IDW_WAVE"), _T("WAVE"));
    if (!hRes) return 0;

    // 3. 載入資源到全域記憶體
    HGLOBAL hGlobal = LoadResource(hInst, hRes);
    if (!hGlobal) return 0;

    // 4. 鎖定記憶體取得指標
    LPVOID pSoundData = LockResource(hGlobal);
    if (!pSoundData) {
        FreeResource(hGlobal); // 雖然 LockResource 通常不需 Unlock,但載入失敗釋放是好習慣
        return 0;
    }

    // 5. 播放:SND_MEMORY 表示記憶體資料,SND_SYNC 同步播放 (播放完畢才返回)
    sndPlaySound((LPCSTR)pSoundData, SND_MEMORY | SND_SYNC);

    // 6. 釋放資源 (實際上 LoadResource 在模組卸載時自動釋放,此處為規範流程)
    FreeResource(hGlobal);
    return 0;
}

三、 關鍵 API 串聯說明

步驟API用途
1AfxGetInstanceHandle()取得當前 EXE/DLL 的模組句柄
2FindResource(hMod, name, type)定位資源目錄項,返回 HRSRC
3LoadResource(hMod, hRes)將資源資料載入全域堆疊,返回 HGLOBAL
4LockResource(hGlobal)鎖定記憶體區塊,返回資料起始指標 LPVOID
5sndPlaySound(ptr, SND_MEMORY|SND_SYNC)從記憶體播放波形聲音
6FreeResource(hGlobal)釋放載入的資源記憶體

四、 注意事項

  • 資源 ID 在 .rc 中定義為字串 "IDW_WAVE",FindResource 參數需對應字串 _T("IDW_WAVE"),或使用 MAKEINTRESOURCE(IDW_WAVE) (需在 resource.h 定義符號值)。
  • SND_SYNC 會阻塞執行緒直到播放結束;若需非同步播放,改用 SND_ASYNC,但需自行管理記憶體生命週期 (不可立即 FreeResource)。
  • 大型 WAV 檔會增加 EXE 體積,權衡嵌入與外部檔案部署。

此法適用於 VC 6.0 至 Visual Studio 現代版本,是嵌入式聲音播放的標準做法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved