Cały czas bawię się z DirectShow. Chciałem go użyć w Windows Form Application. Na początek, w ramach prób, chciałem, aby po naciśnięciu jakiegoś przycisku móc oglądać materiał filmowy.
Próbuję zaimplementować kod ze strony MS http://msdn.microsoft.com/en-us/library/ms783787.
Funkcja programująca button wygląda następująco:
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e) {
hr = CoInitialize(NULL);
if (FAILED(hr))
{
label1->Text="Błąd wywołania funkcji CoInitialize() !!!";
}
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph); //BŁĄD KOMPILATORA
if (FAILED(hr))
{
printf("ERROR - Could not create the Filter Graph Manager.");
return;
}
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);//BŁĘDY
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); //KOMPILATORA
hr = pGraph->RenderFile(L"D:\\Filmy\\jakis.avi", NULL);
if (SUCCEEDED(hr))
{
// Run the graph.
hr = pControl->Run();
if (SUCCEEDED(hr))
{
// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
}
}
pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();
}
Wcześniej deklaruję:
public: HRESULT hr;
private: IGraphBuilder *pGraph;
private: IMediaEvent *pEvent;
private: IMediaControl *pControl;
Niestety, następuje błąd kompilatora:
error C2440: 'type cast' : cannot convert from 'cli::interior_ptr<Type>' to 'void **'
Cannot convert a managed type to an unmanaged type
a dokładnie trzy takie błędy, przy próbie wywoałań funkcji: CoCreateInstance() oraz QueryInterface().
Czy da się coś z tym zrobić?
Próbowałem *pGraph definiować jako void i dopiero po wywołaniu funkcji CoCreateInstance rzutować na typ IGraphBuilder, ale wtedy był błąd rzutowania do typu LPVOID * podczas wywołania funkcji CoCreateInstance...