waveoutをつかった音合成のプログラムを作っているのですが
debugするとメモリ解放時に
HEAP[wavelast_debug.exe]: Heap block at 00191D30 modified at 0019C97C past requested size of ac44
スレッド(&HDE0)のブレーク ポイント(EPI=&H77F75554)。
HEAP[wavelast_debug.exe]: Invalid Address specified to RtlFreeHeap( 00140000, 00191D38 )
スレッド(&HDE0)のブレーク ポイント(EPI=&H77F75554)。
というエラーが出ます。これってメモリのエラーですよね?
(経験上そう思う)
ところが実際にコンパイルしてみると
正常に動作します。
しかしエラーが出る以上はやはり問題があると思います。
メモリ上のエラーは致命的なので何とかしたいです。
実はメモリやwaveoutはあまり知らないので
勉強しながらやっている状態です。
ソースをさらしたいのですが超ロングぐだぐだクソースなため
見せるに忍びないので重要そうな部分をさらします。
メモリ確保から演奏開始まで
コード: 全て選択
ZeroMemory(VarPtr(pwh),sizeof(WAVEHDR))
pwh.lpData=HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,SRATE)'SRATEは曲の長さ
For i=0 TO SRATE
pwh.lpData(i)=(i番目のデータ)←省略している
Next
pwh.dwBufferLength=SRATE
pwh.dwFlags=WHDR_BEGINLOOP or WHDR_ENDLOOP
pwh.dwLoops=1
waveOutPrepareHeader(hwo,pwh,sizeof(WAVEHDR))
waveOutWrite(hwo,pwh,sizeof(WAVEHDR))
で問題となる終了時はコールバックにて
コード: 全て選択
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case dwMsg
case MM_WOM_DONE
waveOutUnprepareHeader(hWaveOut,pwh,sizeof(WAVEHDR))
HeapFree(GetProcessHeap(),0,pwh.lpData)←ここでエラーが出る
waveoutではwaveOutUnprepareHeaderとHeapFreeは
プログラム終了時だけではなく、演奏終了時にやらないと
メモリ使用量が上昇してしまうので抜け目なくやっているつもりです。
実際メモリ使用量も上がったり下がったりで困っています。
・・・どうでも良いですが実はVer2.0辺りからABをやっていて
掲示板にもちょくちょく顔を出していたのですが、いつの間にか行かなくなり
ABもVer3.0~4.0初期しか使用しておらず、最近来て見たら
Ver5.0とかの話になってて時代の流れを感じました。