將 WAV 音效檔內嵌於執行檔資源中,執行時直接從記憶體播放,可避免外部檔案相依、提升載入速度並簡化部署。關鍵在於使用 SND_MEMORY 旗標搭配 sndPlaySound / PlaySound API。
.rc 右鍵 View Code。// 在 .rc 檔案中加入
MY_WAVE WAVE "C:\\Project\\Sounds\\cool.wav"
格式:ResourceName WAVE "AbsoluteFilePath"。資源名稱 MY_WAVE 即為後續程式碼使用的識別字串。
BOOL PlayResourceWave(LPCTSTR pszResourceName)
{
HINSTANCE hInst = AfxGetInstanceHandle();
// 1. 尋找資源
HRSRC hResInfo = FindResource(hInst, pszResourceName, _T("WAVE"));
if (!hResInfo) return FALSE;
// 2. 載入資源
HGLOBAL hRes = LoadResource(hInst, hResInfo);
if (!hRes) return FALSE;
// 3. 鎖定資源取得記憶體指標
LPVOID pResData = LockResource(hRes);
if (!pResData) return FALSE;
// 4. 從記憶體播放 (同步等待播放完成)
BOOL bResult = sndPlaySound((LPCSTR)pResData, SND_MEMORY | SND_SYNC);
// 5. 釋放資源 (Windows 會自動管理,但良好習慣可呼叫)
FreeResource(hRes);
return bResult;
}
void CMyDlg::OnPlaySound()
{
if (!PlayResourceWave(_T("MY_WAVE")))
AfxMessageBox(_T("播放失敗:資源不存在或格式錯誤"));
}
| 旗標 | 作用 |
|---|---|
SND_MEMORY | 參數為記憶體指標而非檔案路徑 (必要)。 |
SND_SYNC | 同步播放,函式阻塞直到播放結束。 |
SND_ASYNC | 非同步播放,函式立即返回,背景播放。 |
SND_LOOP | 循環播放,需搭配 SND_ASYNC。 |
SND_NODEFAULT | 找不到聲音時不播放系統預設音效。 |