winsdk microsoft c++ com directshow

c++ - microsoft - sdk de windows



El código de DirectShow falla después de la salida(muestra de PushSourceDesktop) (1)

El gran problema es que debe llamar a CoUninitialize solo después de que se hayan CoUninitialize todos los punteros COM. Ahora que está utilizando punteros crudos en lugar de las plantillas inteligentes similares a CComPtr , su código es poco legible, y es muy fácil cometer un error y olvidarse de lanzar uno de los punteros. CoUninitialize limpia las cosas y luego parece que algún objeto COM sigue vivo y rápidamente se mete en problemas y bloquea tu aplicación.

Además de esto, no veo una razón para que usted use el apartamento COINIT_MULTITHREADED . Para evitar problemas, debería hacer toda la gestión de nivel superior en gráficos de filtro desde el hilo STA. Streaming y subprocesos de trabajo serán MTA, y está bien.

ATL ofrece plantillas CComPtr bien descritas en MSDN. DirectShow BaseClasses le ofrece un QzCComPtr analógico QzCComPtr que le sugiero que empiece a usar para su propia conveniencia.

Tu código se verá así:

CoInitialize(...); { CComPtr<IFooA> pFooA; CComPtr<IFooB> pFooB; // ... } CoUninitialize();

La idea es que todos los ~CComPtr se hagan antes de que el código llegue a CoUninitialize .

Estoy tratando de usar el filtro de captura de escritorio que viene con el SDK (PushSourceDesktop). Lo compilé y parece que lo uso con éxito, ya que realmente captura mi escritorio y lo guarda en un archivo. Pero la aplicación falla cuando termina / finaliza.

Cuando rompo el error, solo dice que no hay fuente disponible y la ubicación de la pila de llamadas es KernelBase.dll! 7560280C ().

Pensé que podría probarlo aquí para ver si alguien puede reconocer algún problema o si estoy haciendo algo abiertamente incorrecto que pueda causar el bloqueo. ¡Gracias por adelantado!

EDITAR: código de trabajo

int main() { HRESULT hr; hr = CoInitialize(NULL); { CComPtr<IBaseFilter> pMux; CComPtr<IMediaControl> pMC; CComPtr<IBaseFilter> pFilterr; CComPtr<IGraphBuilder> pGraph; CComPtr<ICaptureGraphBuilder2> pBuild; CComPtr<IUnknown> pUnk; hr = CoCreateInstance(CLSID_CaptureGraphBuilder2, NULL, CLSCTX_INPROC_SERVER, IID_ICaptureGraphBuilder2, (void**)&pBuild); hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)(&pGraph)); hr = pBuild->SetFiltergraph(pGraph); static CLSID const clsid = {0x4ea6930a, 0x2c8a, 0x4ae6, {0xa5, 0x61, 0x56, 0xe4, 0xb5, 0x4, 0x44, 0x37}}; //Pushsourcedesktop hr = CreateObjectFromPath(TEXT("c://filters//PushSource.dll"), clsid, &pUnk); pFilterr = pUnk; if (SUCCEEDED(hr)) { HRESULT hr = pGraph->AddFilter(pFilterr, L"Private Filter"); } hr = pBuild->SetOutputFileName( &MEDIASUBTYPE_Avi, // Specifies AVI for the target file. L"C://wav//Example2.avi", // File name. (IBaseFilter**)&pMux, // Receives a pointer to the mux. NULL); hr = pBuild->RenderStream( NULL,//PIN_CATEGORY_CAPTURE,//NULL,//&PIN_CATEGORY_CAPTURE, // Pin category. NULL,//&MEDIATYPE_Video,//&MEDIATYPE_Interleaved,//NULL,//&MEDIATYPE_Audio, // Media type. pFilterr,//pSrc, // Capture filter. NULL,//pCompression2, //pCompression, // Intermediate filter (optional). (IBaseFilter*)pMux); // Mux or file sink filter. hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pMC); printf("START"); pMC->Pause(); hr = pMC->Run(); Sleep(4000); hr = pMC->Stop(); printf("END"); } CoUninitialize(); return 0; }