Buongiorno,
premetto che conosco pochissimo le DirectX.

Devo modificare un programma console che usava VFW per acquisire un'immagine da una webcam, elaborarla e fare diversi lavori.
Ora devo passare alle DirectX perché devo lavorare in automatico con 2 webcam.

Sono riuscito, modificando un esempio trovato su internet, a fare quello che mi serve a parte che mi si apre il preview e devo chiuderlo a mano per andare avanti con il programma.

Eppure ho levato l'interfaccia IVideoWindow che pensavo fosse quella della finestra preview.

Dove sbaglio?

Mille grazie

Paolo

codice:
HRESULT hr;  	// variabili per la gestione dell'anteprima 	
IGraphBuilder *pGraph; 	
ICaptureGraphBuilder2 *pBuild; 	
//IVideoWindow  * g_pVW = NULL; 	
IMoniker * pMon = NULL; 	
IBaseFilter *myFilt; 	
IAMStreamConfig *pConfig = NULL; 
IMediaControl * g_pMC = NULL; 	
AM_MEDIA_TYPE *pmt;      // variabili per la gestione del grabber video     
IBaseFilter *pSG_Filter; // filtro x il grab del singolo frame     
ISampleGrabber *myGrab;  // il vero grabber.      
SampleGrabberCallback g_StillCapCB; // la classe che si occuperà del callback del grabber  	
...
// Recupera il riferimento alla periferica selezionata     pMon=  getDevices(num_camera);  	// Crea il filtro da aggiungere al grafo dei filtri di Dshow   	hr = pMon->BindToObject(0,0,IID_IBaseFilter,(void **)&myFilt);  	if (hr!=S_OK) 	{ 		return FALSE; 	}  	
// Crea il filtro da aggiugnere al grafo ( il grabber del singolo frame ) 	
hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pSG_Filter);  	
if (hr!=S_OK) 	
{ 		return FALSE; 	}  	
// Crea il builder per il grafo dei filtri 	
hr =  CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild );  	
if (hr!=S_OK) 	
{ 		return FALSE; 	}  	
// Crea il manager dei filtri 	
hr = CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);  	
if (hr!=S_OK) 	
{ 		return FALSE; 	}  	
// Setta il manager dei filtri del builder.  	  
pBuild->SetFiltergraph(pGraph);   	  // aggiunge i filtri che ci servono al grafico dei filtri.  	  
pGraph->AddFilter(myFilt,L"Devices"); 	  
pGraph->AddFilter(pSG_Filter,L"Grabber"); 
pBuild->FindInterface(&PIN_CATEGORY_CAPTURE, NULL, myFilt,IID_IAMStreamConfig, (void**)&pConfig);  	  
hr = pConfig->GetFormat(&pmt);  	  
VIDEOINFOHEADER *pVih = reinterpret_cast<VIDEOINFOHEADER*>(pmt->pbFormat);
 pVih->bmiHeader.biWidth = sizeW; 	  
pVih->bmiHeader.biHeight = sizeH;  	  
hr = pConfig->SetFormat(pmt);  	  
// Utilizza il PIN di preview per generare un'anteprima dell'immagine che sarà  	  // catturata. Dall'anteprima lo passa al grabber. 	 
 hr = pBuild->RenderStream(&PIN_CATEGORY_CAPTURE,&MEDIATYPE_Video,myFilt,pSG_Filter,NULL);
  // Recuperiamo l'interfaccia per la gestione del grabber. 	  
hr = pSG_Filter->QueryInterface(IID_ISampleGrabber,(void **)&myGrab);  	 
 // impostiamo il grabber in modo da fargli salvare la bitmap in un percorso 	 
 myGrab->SetOneShot(true); 	  
myGrab->SetBufferSamples(true);   
myGrab->SetCallback(&g_StillCapCB,1); // 1 xè deve usare il bufferCb 	  myGrab->GetConnectedMediaType(&g_StillMediaType);         	  
// Recupera la finestra di preview e il media control  	  //pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW); 
pGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC); 	  
// Setta la finestra di preview come visibile 	  
//hr = g_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN| WS_VISIBLE| WS_OVERLAPPEDWINDOW); 	 
 //hr = g_pVW->put_Visible(OATRUE);  	  
catturata_img = FALSE;  	  
// Avvia il redering del flusso nella finestra di preview 	 
g_pMC->Run();  	 
*MSG msg;  	  
// Main message loop       
while(GetMessage(&msg,NULL,0,0) && (catturata_img == FALSE)) 	  
{ 			
TranslateMessage(&msg); 			
DispatchMessage(&msg); 	  
}  	  
g_pMC->Stop(); 	  
g_pMC->Release(); 	 
//g_pVW->Release(); 	  
pGraph->Release(); 	  
myGrab->Release(); 	  
pSG_Filter->Release(); 	 
 pBuild->Release(); 	  
pConfig->Release();