首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么QueryInterface()返回E_INVALIDARG?

为什么QueryInterface()返回E_INVALIDARG?
EN

Stack Overflow用户
提问于 2020-12-03 01:08:48
回答 1查看 144关注 0票数 0

我在编写一个项目时遇到了一个QueryInterface()返回E_INVALIDARG的bug,我不知道哪个参数是无效的,因为这两个参数都够简单的,我是不是忽略了一些简单的东西?

失败的部分来自微软自己,特别是文档,如果我做错了什么,告诉我

代码语言:javascript
复制
HRESULT CreateSecondaryBuffer(LPDIRECTSOUND8 lpDirectSound, LPDIRECTSOUNDBUFFER8* ppDsb8, LPCWSTR lpName) {
    WAVEFORMATEX wfx;
    DSBUFFERDESC dsbdesc;
    LPDIRECTSOUNDBUFFER pDsb = NULL;
    HRESULT hr = 0;

    void* lpRes;
    HRSRC hResInfo;
    HGLOBAL hRes;

    LPVOID lpvWrite;
    DWORD  dwLength;

    waveFile myWave;
    memset(&myWave, 0, sizeof(waveFile));
    // Find the WAVE resource. 

    hResInfo = FindResource(wc.hInstance, lpName, L"WAVE");
    if (hResInfo == NULL)
        return FALSE;

    // Load the WAVE resource. 

    hRes = LoadResource(wc.hInstance, hResInfo);
    if (hRes == NULL)
        return FALSE;

    // Lock the WAVE resource and play it. 

    lpRes = LockResource(hRes);
    char* wavMem = static_cast<char*>(lpRes);
    memcpy(&myWave, wavMem, 36);
    wavMem += 36;
    

    while (myWave.Subchunk2ID[0] != 'd' && myWave.Subchunk2ID[1] != 'a' && myWave.Subchunk2ID[2] != 't' && myWave.Subchunk2ID[3] != 'a') {
        memcpy(&myWave.Subchunk2ID, wavMem, 8);
        if (myWave.Subchunk2ID[0] != 'd' && myWave.Subchunk2ID[1] != 'a' && myWave.Subchunk2ID[2] != 't' && myWave.Subchunk2ID[3] != 'a') {
            wavMem += myWave.Subchunk2Size;
            wavMem += 8;
        }
    }
    wavMem += 8;

    char* soundData = new char[myWave.Subchunk2Size];
    memcpy(soundData, wavMem, myWave.Subchunk2Size);
    FreeResource(hRes);

    // Set up WAV format structure. 

    memset(&wfx, 0, sizeof(WAVEFORMATEX));
    wfx.wFormatTag = WAVE_FORMAT_PCM;
    wfx.nChannels = myWave.NumChannels;
    wfx.nSamplesPerSec = myWave.SampleRate;
    wfx.nBlockAlign = myWave.BlockAlign;
    wfx.nAvgBytesPerSec = wfx.nSamplesPerSec * wfx.nBlockAlign;
    wfx.wBitsPerSample = myWave.BitsPerSample;

    // Set up DSBUFFERDESC structure. 

    memset(&dsbdesc, 0, sizeof(DSBUFFERDESC));
    dsbdesc.dwSize = sizeof(DSBUFFERDESC);
    dsbdesc.dwFlags =
         DSBCAPS_CTRLVOLUME | DSBCAPS_GLOBALFOCUS;
    dsbdesc.dwBufferBytes = myWave.Subchunk2Size;
    dsbdesc.lpwfxFormat = &wfx;

    hr = lpDirectSound->CreateSoundBuffer(&dsbdesc, &pDsb, NULL);
    if (SUCCEEDED(hr))
    {
        if (DS_OK == pDsb->Lock(
            0,          // Offset at which to start lock.
            0,          // Size of lock; ignored because of flag.
            &lpvWrite,  // Gets address of first part of lock.
            &dwLength,  // Gets size of first part of lock.
            NULL,       // Address of wraparound not needed. 
            NULL,       // Size of wraparound not needed.
            DSBLOCK_ENTIREBUFFER))  // Flag.
        {
            memcpy(lpvWrite, soundData, dwLength);
            pDsb->Unlock(
                lpvWrite,   // Address of lock start.
                dwLength,   // Size of lock.
                NULL,       // No wraparound portion.
                0);         // No wraparound size.
        }
        hr = pDsb->QueryInterface(IID_IDirectSoundBuffer8, (LPVOID*)ppDsb8);
        pDsb->Release();
    }

    delete[] soundData;
    return hr;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-03 01:40:29

QueryInterface()只有两个参数可供E_INVALIDARG抱怨,而在您的CreateSecondaryBuffer()函数中,这些参数在我看来还不错。第一个参数正在传递一个硬编码的IID,所以问题必须与第二个参数有关,该参数期望被传递一个指向(在本例中) IDirectSoundBuffer8*变量的指针,QueryInterface()可以将DirectSoundBuffer8对象的内存地址写入其中。因此,最有可能的情况是,您的ppDsb8函数的CreateSecondaryBuffer()参数不会像您所期望的那样传递到IDirectSoundBuffer8*变量的有效指针。

UPDATE:在看到添加的注释后,确实传递了指向CreateSecondaryBuffer()ppDsb8参数的无效指针。调用方的pMainSecondaryBuffer指针被不正确地声明,并且在传递给CreateSecondaryBuffer()时未初始化,因此您将一个错误的指针传递到QueryInterface(),从而导致E_INVALIDARG错误。

用这个代替:

代码语言:javascript
复制
LPDIRECTSOUND8 lpDevice = ...; // <-- make sure it points to a valid device object...
LPDIRECTSOUNDBUFFER8 pMainSecondaryBuffer;
CreateSecondaryBuffer(lpDevice, &pMainSecondaryBuffer, L"mainSong");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65118449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档