游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3498|回复: 7

几天都无法解决,离发疯不远了,各位帮忙看下吧,唉,

[复制链接]

1

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-7-5 12:00:00 | 显示全部楼层 |阅读模式
这个问题,搞好好几天了,还是搞不好,在有问题的一句里,我写了一条注释,//来到这里的时候就说内存错误了

编程实在是另人抓狂呀,好实说,有时候我觉得做掏屎工也比编程好,至少我可以知道每天能扫多少个屎坑,但编程不行呀,不能有计划,不能有目标,否则就等着发疯吧,本来我不想用directsound的,但不用又不能做混音,谁知道不学不知道,学了更不知道了

明明整个程序都懂了,但问题就是解决不了,那位好心人,帮忙看下吧,下辈子给您老做牛做马,这辈子就先记着帐吧。




#include "stdafx.h"
#include "resource.h"
//#include <windows.h>   // include all the windows headers
//#include <windowsx.h>  // include useful macros
#include "mmsystem.h"  // very important and include WINMM.LIB too!
#include "ddraw.h"
#include "dsound.h"


//?办跑计??
HINSTANCE hInst;
HBITMAP hbmp;
HDC                mdc,hDC;
HBITMAP                hBitmap;
BITMAP                bm;//用于临时取得一个位图的大小

HWND  m_hWnd;//全局窗口备份

//LPDIRECTSOUND lpds;
//LPDIRECTSOUNDBUFFER lpdsb[5]; //配置五个音效指标

//ㄧΑ??
ATOM                                MyRegisterClass(HINSTANCE hInstance);
BOOL                                InitInstance(HINSTANCE, int);
LRESULT CALLBACK        WndProc(HWND, UINT, WPARAM, LPARAM);
void                                MyPaint(HDC hdc);
void                                jian_p(int wParam);


HRESULT result;                 //宣告HRESULT型变量,用于保存建立对象返回的变量
LPDIRECTSOUND pDS;                                //宣告DirectSound物件指标
LPDIRECTSOUNDBUFFER pPBuf;                //宣告主缓冲区指标
LPDIRECTSOUNDBUFFER pSBuf[2];        //宣告次缓冲区
DSBUFFERDESC dsdesc;                        //宣告描述结构




int OnCreate();
LPDIRECTSOUNDBUFFER createbuffer(char* filename);

//****??Α**************************************
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
        MSG msg;

        MyRegisterClass(hInstance);

        //磅︽??てㄧΑ
        if (!InitInstance (hInstance, nCmdShow))
        {
                return FALSE;
        }

        //???伴
        while (GetMessage(&msg, NULL, 0, 0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
       
        return msg.wParam;
}

//****??の爹?跌怠摸?ㄧΑ*************************
ATOM MyRegisterClass(HINSTANCE hInstance)
{
        WNDCLASSEX wcex;

        wcex.cbSize = sizeof(WNDCLASSEX);
        wcex.style                        = CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc        = (WNDPROC)WndProc;
        wcex.cbClsExtra                = 0;
        wcex.cbWndExtra                = 0;
        wcex.hInstance                = hInstance;
        wcex.hIcon                        = NULL;
        wcex.hCursor                = NULL;
        wcex.hCursor                = LoadCursor(NULL, IDC_ARROW);
        wcex.hbrBackground        = (HBRUSH)(COLOR_WINDOW+1);
        wcex.lpszMenuName        = NULL;
        wcex.lpszClassName        = "canvas";
        wcex.hIconSm                = NULL;

        return RegisterClassEx(&wcex);
}

//****??ㄧΑ*************************************
// 1.?ミ?跌怠 DC ????拘砰 DC
// 2.?郎?更???瓜?匡ノ??拘砰 DC
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
        HWND hWnd;
        HDC hdc;

        hInst = hInstance;

        hWnd = CreateWindow("canvas", "酶瓜跌怠" , WS_OVERLAPPEDWINDOW,
                CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

        if (!hWnd)
        {
                return FALSE;
        }
        m_hWnd = hWnd;

        MoveWindow(hWnd,10,10,600,450,true);
        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);

        /*hdc = GetDC(hWnd);
        mdc = CreateCompatibleDC(hdc);

        hbmp = (HBITMAP)LoadImage(NULL,"bg.bmp",IMAGE_BITMAP,600,450,LR_LOADFROMFILE);
        SelectObject(mdc,hbmp);


        MyPaint(hdc);
        ReleaseDC(hWnd,hdc);*/

        BITMAP                bm;   
        /*HBITMAP                hBitmap, hOldBmp; */
       


        hDC = GetDC(hWnd);
        hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
        //hBitmap=LoadBitmap(hInstance,BmpName);
        // 或用   hBitmap=LoadBitmap(hInstance,MAKEINTRESOURCE(BmpID));   
        //BmpName   是BMP在RC文件中定义的名称(字符串),可与盘上的BMP文件名不同   
        //BmpID   是BMP在RC文件中定义的标识符(WORD   型)   
        mdc=CreateCompatibleDC(hDC);     //hDC   为屏幕窗口的DC   
        SelectObject(mdc,   hBitmap);   
        //hOldBmp=(HBITMAP)SelectObject(hDCMem,   hBitmap);
        GetObject(hBitmap,sizeof(BITMAP),   &bm);   
        BitBlt(hDC,   0,   0,   bm.bmWidth,   bm.bmHeight,   mdc,   0,   0,   SRCCOPY);


        pSBuf[0] = createbuffer("dyj.wav");
        pSBuf[0]-&gtlay(0,0,1);
       

        //PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ1), hInstance, SND_RESOURCE | SND_SYNC);

        return TRUE;
}

//****??酶瓜ㄧΑ*********************************
void MyPaint(HDC hdc)
{
        BitBlt(hdc,0,0,600,450,mdc,0,0,SRCCOPY);        //?瓜
}

//****????ㄧΑ***********************************
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
        PAINTSTRUCT ps;
        HDC hdc;

        switch (message)
        {
                case WM_KEYDOWN:
                        jian_p(wParam);
                        break;
                case WM_PAINT:                                                //跌怠?酶??
                        hdc = BeginPaint(hWnd, &ps);
                        MyPaint(hdc);
                        EndPaint(hWnd, &ps);
                        break;
                case WM_DESTROY:                                        //跌怠挡???
                        DeleteDC(mdc);
                        DeleteObject(hBitmap);
                        ReleaseDC(hWnd,hDC);
                        pSBuf[0]->Stop();
                        pSBuf[0]->Release();
                        pSBuf[1]->Release();
                        PostQuitMessage(0);
                        break;
                default:                                                        //ㄤウ??
                        return DefWindowProc(hWnd, message, wParam, lParam);
   }
   return 0;
}

void jian_p(int wParam){
        wParam = wParam - 48;
        if(wParam == 1){
                PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ1), hInst, SND_RESOURCE | SND_ASYNC);
        }else if(wParam == 2){
                PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ2), hInst, SND_RESOURCE | SND_ASYNC | SND_NOSTOP | SND_LOOP);
        }else if(wParam == 3){
                PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ3), hInst, SND_RESOURCE | SND_SYNC);
        }else if(wParam == 4){
                PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ4), hInst, SND_RESOURCE | SND_SYNC);
        }else if(wParam == 5){
                PlaySound(MAKEINTRESOURCE(SOUND_ID_BJ5), hInst, SND_RESOURCE | SND_SYNC);
        }else if(wParam == 6){
                PlaySound(MAKEINTRESOURCE(SOUND_ID_ZD), hInst, SND_RESOURCE | SND_ASYNC | SND_NOSTOP | SND_NOWAIT);
        }else if(wParam == 7){
               
                pSBuf[0]->Play(0,0,1);                                                //播放背景音乐

        }else if(wParam == 8){
        }else if(wParam == 9){
        }else if(wParam == 0){
                //停止所有的声音
        }
}

LPDIRECTSOUNDBUFFER createbuffer(char* filename)
{       
       

        HMMIO                hmmio;                                        //开启多媒体档案
        MMRESULT        mmresult;                                //传回结果
        MMCKINFO      ckRiff;                        //RIFF区块的资讯
        MMCKINFO      ckInfo;                        //子区块的资讯
        DWORD size;                                                //实际资料大小
        LPVOID pAudio;
        DWORD bytesAudio;
       
WAVEFORMATEX swfmt;                                //声音结构
//DSBUFFERDESC dsdesc;                        //描述结构

        LPDIRECTSOUNDBUFFER buf;
        LPDIRECTSOUNDBUFFER pbuf;
        //DSBUFFERDESC dsdesc;                        //宣告描述结构
        hmmio = mmioOpen(filename, NULL, MMIO_ALLOCBUF|MMIO_READ );
        //开启档案
        if(hmmio == NULL)                           //判断是否无效
                MessageBox(m_hWnd, "档案不存在","错误",0);
        ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
        //设定档案类型
        mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);
        //搜寻形态
        if(mmresult != MMSYSERR_NOERROR)
                MessageBox(m_hWnd, "档案格式错误!","错误",0);
        ckInfo.ckid = mmioFOURCC('f','m','t',' ');  //设定区块类型
        mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
        //搜寻区块
        if(mmresult != MMSYSERR_NOERROR)
                MessageBox(m_hWnd, "档案模式错误!","错误",0);
        if(mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt)) == -1) //读取档案格式
                MessageBox(m_hWnd, "读取档案格式失败!","错误",0);
        mmresult = mmioAscend(hmmio,&ckInfo,0);     //跳出子区块
        ckInfo.ckid = mmioFOURCC('d','a','t','a');  //设定区块类型
        mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
        //搜寻区块
        if(mmresult != MMSYSERR_NOERROR)
                MessageBox(m_hWnd, "档案格式错误!","错误",0);
        size = ckInfo.cksize;                       //取得实际资料大小
        memset( &dsdesc,0,sizeof(dsdesc));        //清空结构内容
    dsdesc.dwSize  = sizeof(dsdesc);          //配置结构大小
    dsdesc.dwFlags =          DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;
    dsdesc.dwBufferBytes = size;            //设定缓冲缓冲区大小
    dsdesc.lpwfxFormat   = &swfmt;          //设定缓冲区格式
    result = pDS->CreateSoundBuffer( &dsdesc, &pbuf, NULL );//来到这里的时候就说内存错误了
        if(result != DS_OK)
                MessageBox(m_hWnd, "建立次缓冲区失败!","错误",0);

        result = pbuf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);
        //锁定缓冲区
        if(result != DS_OK)
                MessageBox(m_hWnd, "锁定缓冲区失败!","错误",0);
        mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
        //读取音档资料
        if(mmresult == -1)
                MessageBox(m_hWnd, "读取音档资料失败!","错误",0);
        result = pbuf->Unlock(pAudio,bytesAudio,NULL,NULL);
        //解除锁定区
        if(result != DS_OK)
                /*MessageBox("解除锁定缓冲区失败!");*/
        mmioClose(hmmio,0);
        return pbuf;
}
int OnCreate()
{
        WAVEFORMATEX pwfmt;                                //宣告声音结构
        //DSBUFFERDESC dsdesc;                        //宣告描述结构

    result = DirectSoundCreate( NULL, &pDS, NULL ); //建立DirectSound物件
        if(result != DS_OK)
                MessageBox(m_hWnd, "建立DirectSound物件失败","错误",0);
    result = pDS->SetCooperativeLevel( m_hWnd, DSSCL_PRIORITY );
        if(result != DS_OK)
                MessageBox(m_hWnd, "设定协调层级失败","错误",0);
    memset( &dsdesc,0, sizeof(dsdesc) );          //清空结构内容
    dsdesc.dwSize        = sizeof(dsdesc);        //配置描述结构大小
    dsdesc.dwFlags       = DSBCAPS_PRIMARYBUFFER;
    dsdesc.dwBufferBytes = 0;
    dsdesc.lpwfxFormat   = NULL;
    result = pDS->CreateSoundBuffer( &dsdesc, &pPBuf, NULL );
        if(result != DS_OK)
                MessageBox(m_hWnd, "建立缓冲区失败","错误",0);
    memset( &pwfmt,0, sizeof(pwfmt) );
    pwfmt.wFormatTag      = WAVE_FORMAT_PCM;
    pwfmt.nChannels       = 2;               //播放声道
    pwfmt.nSamplesPerSec  = 44100;           //播放频率
    pwfmt.wBitsPerSample  = 16;              //位元
    pwfmt.nBlockAlign     = pwfmt.wBitsPerSample / 8 * pwfmt.nChannels;
    pwfmt.nAvgBytesPerSec = pwfmt.nSamplesPerSec * pwfmt.nBlockAlign;
    result = pPBuf->SetFormat(&pwfmt);       //设定播放格式
        if(result != DS_OK)
                MessageBox(m_hWnd, "设定播放格式失败","错误",0);
        return 1;
}

36

主题

382

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 2006-7-5 20:45:00 | 显示全部楼层

Re:几天都无法解决,离发疯不远了,各位帮忙看下吧,唉

result = pDS->CreateSoundBuffer( &dsdesc, &pbuf, NULL );//来到这里的时候就说内存错误了
显然,要么是pDs非法,要么是pbuf不对。要么就是上一次的内存操作有问题。。。

45

主题

1163

帖子

1165

积分

金牌会员

Rank: 6Rank: 6

积分
1165
发表于 2006-7-5 22:41:00 | 显示全部楼层

Re:几天都无法解决,离发疯不远了,各位帮忙看下吧,唉

掏屎工比编程实在?也太离谱了吧

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-5-25 15:21:00 | 显示全部楼层

Re:几天都无法解决,离发疯不远了,各位帮忙看下吧,唉

请问这个问题搞定了吗,我也遇到了!!!!!!!!!!!求助!!!!!!!!!!!!!

4

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2007-5-27 19:00:00 | 显示全部楼层

Re:几天都无法解决,离发疯不远了,各位帮忙看下吧,唉

一般看一下设置的大小有没有异常,还有注意修改一下创建的标志,有些标志不能同时用.

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2007-5-28 11:52:00 | 显示全部楼层

Re:几天都无法解决,离发疯不远了,各位帮忙看下吧,唉

o~ i am vegetable bird,

i guess you should initialize the variable "pbuf" to NULL before you call he CreateSoundBuffer
method.

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-5-28 15:56:00 | 显示全部楼层

Re:几天都无法解决,离发疯不远了,各位帮忙看下吧,唉

内存错误内存里找,自己调不通就把问题项目最小化(删除一切,只留出问题的部分,但一定要能编译通过)然后打包发出来,这样大家才会帮你调。

相信没有人会建个项目把你的代码拷贝进去调。
也没有人会从你一大堆的代码中找问题的根源。
所以你要提供完整可运行的项目和最小化的代码。

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2007-5-28 16:00:00 | 显示全部楼层

Re:几天都无法解决,离发疯不远了,各位帮忙看下吧,唉

顺一句,D3D有调试版的库的,其实可以更深入的跟进去看看。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-26 08:06

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表