请教: 
根据 mxw5495 大哥 提供的网子,找到一个程序: class CSampleGrabberCB : public ISampleGrabberCB 

public: 
long lWidth; 
long lHeight; 
TCHAR m_szFileName[MAX_PATH];// 位图文件名称 
CSampleGrabberCB( ) 

strcpy(m_szFileName, "c:\\donaldo.bmp"); 

STDMETHODIMP_(ULONG) AddRef() { return 2; } 
STDMETHODIMP_(ULONG) Release() { return 1; } 
STDMETHODIMP QueryInterface(REFIID riid, void ** ppv) 

if( riid == IID_ISampleGrabberCB ¦ ¦ riid == IID_IUnknown ) 

*ppv = (void *) static_cast <ISampleGrabberCB*> ( this ); 
return NOERROR; 

return E_NOINTERFACE; 

STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ) 

return 0; 

STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize ) 

if( !bOneShot )return 0; 
if (!pBuffer)return E_POINTER; 
SaveBitmap(pBuffer, lBufferSize); 
bOneShot = FALSE; 
return 0; 

} CSampleGrabberCB mCB; 
CComPtr <ISampleGrabber> m_pGrabber;    //取得视频数据接口 HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd) 

  hr = m_pGrabber->SetCallback( &mCB, 1 ); 

问题1: 
STDMETHODIMP_(ULONG) AddRef() { return 2; } 
STDMETHODIMP_(ULONG) Release() { return 1; } 分别表示什么意思? 
为什么一个 return 2, 一个 return 1; 问题2: 
STDMETHODIMP_(ULONG) AddRef() { return 2; } 
STDMETHODIMP_(ULONG) Release() { return 1; } 这两句有什么作用,我不要这 两句可以不? 问题3: 
STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample ) 
是什么意思? 为什么整个程序没有地方来调用这个函数呢? 问题4: 
STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize ) 

if( !bOneShot )return 0; 
} 这是个函数吗? 
为什么没有整个程序没有一个地方来调用它呢? 问题5: HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd) 

  hr = m_pGrabber->SetCallback( &mCB, 1 ); 
} m_pGrabber->SetCallback( &mCB, 1 ); 
这个是什么意思? 执行这句后,会执行 mCB 的构造函数? 
还是 执行 mCB 的什么呢? 谢谢! 

解决方案 »

  1.   

    谢谢这只是设置一下回调函数而已STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize ) 

    if( !bOneShot )return 0; 
    } 这里设置了哪个为回调函数啊?一个函数被设置为了回调函数有什么用?
      

  2.   

    STDMETHODIMP BufferCB( double dblSampleTime, BYTE * pBuffer, long lBufferSize )
       {
      return 0;
       }
       
    (摄像头得到的数据放在 pBuffer,指向的内存里)
       
    我什么把 摄像头的 数据在 HGE 显示出来HGE 函数(纹理地址琐定函数)DWORD *Texture_Lock(HTEXTURE texture,bool bReadOnly = true,int left = 0,int top = 0,int width = 0,int height = 0);返回值
    如果使用成功,从锁定的纹理数据返回指针。否则返回0。LPBYTE buffer1 = (LPBYTE)hge->Texture_Lock(m_hTex,false,0,0,Texture_GetWidth(m_hTex));,hge->Texture_GetHeight(m_hTex));现在只要把 pBuffer 拷贝给  buffer1 就可以了我的基础知识不行
    1:首先开辟缓冲 buffer1 ,可是开辟为什么类型,开辟多大呢?2: 把摄像头得到的缓冲  BYTE * pBuffer 拷贝到 buffer1
    内存拷贝:
    memcpy(buffer1,pBuffer,lBufferSize);// 是这样不?
    谢谢!