Browse Source

COM指针用完要Release。

sat23 5 năm trước cách đây
mục cha
commit
517da34cf3

BIN
VideoCapture/VideoCapture.suo


+ 23 - 8
VideoCapture/VideoCapture/CaptureVideo.cpp

@@ -28,6 +28,7 @@ CCaptureVideo::~CCaptureVideo()
 	SAFE_RELEASE(m_pMC);
 	SAFE_RELEASE(m_pGB);
 	SAFE_RELEASE(m_pBF);
+	SAFE_RELEASE(m_pGrabber);
 	CoUninitialize( );
 }
 
@@ -39,16 +40,18 @@ int CCaptureVideo::EnumDevices(HWND hList)
 	//철앨柬틉팝謬�구
 	ICreateDevEnum *pCreateDevEnum;
 	HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (void**)&pCreateDevEnum);
-	if (hr != NOERROR)return -1;
-	IEnumMoniker *pEm;
-	hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEm, 0);
 	if (hr != NOERROR)
 		return -1;
 
-	pEm->Reset();
+	IEnumMoniker *pEnum;
+	hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnum, 0);
+	if (hr != NOERROR)
+		return -1;
+
+	pEnum->Reset();
 	ULONG cFetched;
 	IMoniker *pM;
-	while(hr = pEm->Next(1, &pM, &cFetched), hr==S_OK)
+	while(hr = pEnum->Next(1, &pM, &cFetched), hr==S_OK)
 	{
 		IPropertyBag *pBag;
 		hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pBag);
@@ -69,6 +72,10 @@ int CCaptureVideo::EnumDevices(HWND hList)
 		}
 		pM->Release();
 	}
+
+	pEnum->Release();
+	pEnum = NULL;
+
 	return id;
 }
 
@@ -117,11 +124,13 @@ HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd)
 		AfxMessageBox("Can’t build the graph");
 		return hr;
 	}
+
 	hr = m_pGrabber->GetConnectedMediaType( &mt );
 	if ( FAILED( hr) ){
 		AfxMessageBox("Failt to read the connected media type");
 		return hr;
 	}
+
 	VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat;
 	mCB.lWidth = vih->bmiHeader.biWidth;
 	mCB.lHeight = vih->bmiHeader.biHeight;
@@ -133,7 +142,11 @@ HRESULT CCaptureVideo::Init(int iDeviceID, HWND hWnd)
 	m_hWnd = hWnd ;
 	SetupVideoWindow();
 	hr = m_pMC->Run();//역迦柬틉껫謬
-	if(FAILED(hr)){AfxMessageBox("Couldn’t run the graph!");return hr;}
+	if(FAILED(hr))
+	{
+		AfxMessageBox("Couldn’t run the graph!");
+		return hr;
+	}
 	return S_OK;
 }
 
@@ -143,8 +156,7 @@ bool CCaptureVideo::BindFilter(int deviceId, IBaseFilter **pFilter)
 		return false;
 	// enumerate all video capture devices
 	ICreateDevEnum* pCreateDevEnum;
-	HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,
-		IID_ICreateDevEnum, (void**)&pCreateDevEnum);
+	HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_ICreateDevEnum, (void**)&pCreateDevEnum);
 	if (hr != NOERROR)
 	{
 		return false;
@@ -181,6 +193,9 @@ bool CCaptureVideo::BindFilter(int deviceId, IBaseFilter **pFilter)
 		pM->Release();
 		index++;
 	}
+	pEm->Release();
+	pEm = NULL;
+
 	return true;
 }
 

+ 3 - 0
VideoCapture/VideoCapture/CaptureVideo.h

@@ -18,8 +18,11 @@ class CCaptureVideo
 {
 	friend class CSampleGrabberCB;
 public:
+	// 截图;
 	void GrabOneFrame(BOOL bGrab);
+	// 初始化设备;
 	HRESULT Init(int iDeviceID,HWND hWnd);
+	// 枚举设备;
 	int EnumDevices(HWND hList);
 	CCaptureVideo();
 	virtual ~CCaptureVideo();