Comment inclure Qedit.h de DirectShow au projet?
J'ai besoin d'implémenter cette interface ISampleGrabber
https://docs.microsoft.com/en-us/windows/win32/directshow/isamplegrabber
Ce fichier, pour autant que je sache, doit être dans le SDK Windows, j'ai donc téléchargé le SDK Windows à partir du programme d'installation de Visual Studio

Mais encore je reçois Cannot open source file

Qu'est-ce que je fais mal?
ÉDITER
Par le lien donné à la page ci-dessus, j'ai téléchargé un tel fichier winsdk_web.exe
lorsque j'essaie de l'installer, j'obtiens un tel popup

Selon ce massage contextuel, je dois installer à .NET Framework 4.0
partir de ce lien
http://go.microsoft.com/fwlink/?LinkID=187668
Donc, j'ai téléchargé ce fichier, j'ai essayé de l'installer, mais j'ai reçu un autre message

Quel est le problème ici?
ÉDITER
Je suis nouveau en C ++, mais cela me semble bizarre :) comme si vous aviez une documentation où il est écrit que pour faire quelque chose, vous devez utiliser une interface spécifique, mais cette interface vous ne pouvez pas trouver presque n'importe où, mais ici vous peut télécharger sdk, mais finalement tout n'aide pas et la seule solution est d'ajouter ce code, bien :)
#pragma once
#include <dshow.h>
#include <dvdmedia.h>
#include <dmodshow.h>
class __declspec(uuid("{C1F400A4-3F08-11D3-9F0B-006008039E37}")) NullRenderer;
class __declspec(uuid("{C1F400A0-3F08-11D3-9F0B-006008039E37}")) SampleGrabber;
#pragma region SampleGrabber
struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85"))
ISampleGrabberCB : IUnknown
{
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall SampleCB(
double SampleTime,
struct IMediaSample * pSample) = 0;
virtual HRESULT __stdcall BufferCB(
double SampleTime,
unsigned char * pBuffer,
long BufferLen) = 0;
};
struct __declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f"))
ISampleGrabber : IUnknown
{
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall SetOneShot(
long OneShot) = 0;
virtual HRESULT __stdcall SetMediaType(
struct _AMMediaType * pType) = 0;
virtual HRESULT __stdcall GetConnectedMediaType(
struct _AMMediaType * pType) = 0;
virtual HRESULT __stdcall SetBufferSamples(
long BufferThem) = 0;
virtual HRESULT __stdcall GetCurrentBuffer(
/*[in,out]*/ long * pBufferSize,
/*[out]*/ long * pBuffer) = 0;
virtual HRESULT __stdcall GetCurrentSample(
/*[out,retval]*/ struct IMediaSample * * ppSample) = 0;
virtual HRESULT __stdcall SetCallback(
struct ISampleGrabberCB * pCallback,
long WhichMethodToCallback) = 0;
};
struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37"))
SampleGrabber;
// [ default ] interface ISampleGrabber
#pragma endregion
class TV_AudioDecoder : public ISampleGrabber
{
public:
TV_AudioDecoder();
~TV_AudioDecoder();
public:
virtual HRESULT __stdcall SetOneShot(long OneShot) override;
virtual HRESULT __stdcall SetMediaType(struct _AMMediaType * pType) override;
virtual HRESULT __stdcall GetConnectedMediaType(struct _AMMediaType * pType) override;
virtual HRESULT __stdcall SetBufferSamples(long BufferThem) override;
virtual HRESULT __stdcall GetCurrentBuffer(/*[in,out]*/ long * pBufferSize, /*[out]*/ long * pBuffer) override;
virtual HRESULT __stdcall GetCurrentSample(/*[out,retval]*/ struct IMediaSample * * ppSample) override;
virtual HRESULT __stdcall SetCallback(struct ISampleGrabberCB * pCallback, long WhichMethodToCallback) override;
};
Disons que c'est mon code, est-ce une bonne façon de l'utiliser? Je n'ai rien manqué?
Réponses
Qedit.h a été exclu du SDK Windows à un moment donné dans le passé avec la dépréciation des services d'édition DirectShow. Depuis lors, le runtime est présent dans toutes les versions de Windows.
Vous n'avez rien à installer et, vice versa, l'installation de l'ancien SDK ne vous facilitera pas la vie.
Copiez / collez simplement les en-têtes nécessaires dans votre projet et vous êtes prêt à partir.
Les choses à copier / coller sont mentionnées, par exemple, dans cette rubrique 2009 . Vous pouvez y trouver ma réponse #import
et cela devrait fonctionner aussi. À partir de maintenant, en 2020, je recommanderais toujours de copier / coller les en-têtes manquants.
UPD.
// <your regular includes>
#include <dshow.h>
#include <dvdmedia.h>
#include <dmodshow.h>
class __declspec(uuid("{C1F400A4-3F08-11D3-9F0B-006008039E37}")) NullRenderer;
class __declspec(uuid("{C1F400A0-3F08-11D3-9F0B-006008039E37}")) SampleGrabber;
#pragma region SampleGrabber
struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85"))
ISampleGrabberCB : IUnknown
{
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall SampleCB (
double SampleTime,
struct IMediaSample * pSample ) = 0;
virtual HRESULT __stdcall BufferCB (
double SampleTime,
unsigned char * pBuffer,
long BufferLen ) = 0;
};
struct __declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f"))
ISampleGrabber : IUnknown
{
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall SetOneShot (
long OneShot ) = 0;
virtual HRESULT __stdcall SetMediaType (
struct _AMMediaType * pType ) = 0;
virtual HRESULT __stdcall GetConnectedMediaType (
struct _AMMediaType * pType ) = 0;
virtual HRESULT __stdcall SetBufferSamples (
long BufferThem ) = 0;
virtual HRESULT __stdcall GetCurrentBuffer (
/*[in,out]*/ long * pBufferSize,
/*[out]*/ long * pBuffer ) = 0;
virtual HRESULT __stdcall GetCurrentSample (
/*[out,retval]*/ struct IMediaSample * * ppSample ) = 0;
virtual HRESULT __stdcall SetCallback (
struct ISampleGrabberCB * pCallback,
long WhichMethodToCallback ) = 0;
};
struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37"))
SampleGrabber;
// [ default ] interface ISampleGrabber
#pragma endregion
// <your code>
Voir également:
- Comment utiliser samplegrabber dans vc ++? Le samplegrabber n'est pas défini
- Identifiant non déclaré ISampleGrabber
Je suis nouveau en C ++, mais ça me semble bizarre :) [...]
Il ne s'agit pas exactement de C ++. Il s'agit de savoir comment utiliser la partie OS abandonnée dans votre projet C ++ en réintroduisant sa déclaration supprimée du SDK standard. Oui, en C ++, nous pouvons le faire, ainsi que d'autres astuces sympas.