IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Que veut dire cette ligne ?


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Points : 33
    Points
    33
    Par défaut Que veut dire cette ligne ?
    Arrivez-vous à comprendre ce que veut dire cette ligne ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define DsHook(a,b,c) if (!c##_) { INT_PTR* p=b+*(INT_PTR**)a;   VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no);\
     *(INT_PTR*)&c##_=*p;   VirtualProtect(p,    4,PAGE_EXECUTE_READWRITE,&no);   *p=(INT_PTR)c; }
    Et un peu plus loin :
    Un "if" après un nom de fonction mais avant l'accolade, je ne comprends pas .

    Source, au paragraphe "New method not requiring DirectShow SDK" : http://www.codeproject.com/Articles/...me-grabber-usi

  2. #2
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Salut,

    C'est une macro qui une fois étendue remplace cette ligne là DsHook(mem,6,Receive); par celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (!Receive_) 
    { 
      INT_PTR* p = 6 + *(INT_PTR**)mem;  
      VirtualProtect(&Receive_, 4, PAGE_EXECUTE_READWRITE, &no);
      *(INT_PTR*) & Receive_ =*p;
      VirtualProtect(p, 4, PAGE_EXECUTE_READWRITE,&no);   
      *p=(INT_PTR)Receive; 
    }
    Les macros ne sont donc pas représenté en mémoire, et à l'exécution, elles ont toutes été remplacées par leur définition. L'opérateur ## que tu vois dans le if, c'est l'opérateur de concaténation dans les macros.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Points : 33
    Points
    33
    Par défaut
    Super, merci !

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 48
    Points : 33
    Points
    33
    Par défaut Où est appellé la fonction ?
    Mais alors, pouvez vous dire où (à quel numéro de ligne) est appelé la fonction Receive() ? Je ne vois pas.
    Pourtant le programme original marche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    // Here you get image video data in buf / len. Process it before calling Receive_ because renderer dealocates it.
    HRESULT ( __stdcall * Receive_ ) ( void* inst, IMediaSample *smp ) ; 
    HRESULT   __stdcall   Receive    ( void* inst, IMediaSample *smp )
    {
    BYTE*     buf;
    smp->GetPointer(&buf);
    unsigned int len = smp->GetActualDataLength();
    HRESULT   ret  =  Receive_   ( inst, smp );   
    return    ret; 
    }
     
    int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev,LPSTR cmd,int show)
    {
    	HRESULT hr = CoInitialize(0);
                  MSG msg={0};
                  DWORD no;
     
    	IGraphBuilder*  graph= 0;  hr = CoCreateInstance( CLSID_FilterGraph, 0, CLSCTX_INPROC,IID_IGraphBuilder, (void **)&graph );
    	IMediaControl*  ctrl = 0;  hr = graph->QueryInterface( IID_IMediaControl, (void **)&ctrl );
     
    	ICreateDevEnum* devs = 0;  hr = CoCreateInstance (CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &devs);
    	IEnumMoniker*   cams = 0;  hr = devs?devs->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &cams, 0):0;  
    	IMoniker*       mon  = 0;  hr = cams->Next (1,&mon,0);  // get first found capture device (webcam?)    
    	IBaseFilter*    cam  = 0;  hr = mon->BindToObject(0,0,IID_IBaseFilter, (void**)&cam);
    				hr = graph->AddFilter(cam, L"Capture Source"); // add web cam to graph as source
    	IEnumPins*      pins = 0;  hr = cam?cam->EnumPins(&pins):0;   // we need output pin to autogenerate rest of the graph
    	IPin*           pin  = 0;  hr = pins?pins->Next(1,&pin, 0):0; // via graph->Render
    				hr = graph->Render(pin); // graph builder now builds whole filter chain including MJPG decompression on some webcams
    	IEnumFilters*   fil  = 0;  hr = graph->EnumFilters(&fil); // from all newly added filters
    	IBaseFilter*    rnd  = 0;  hr = fil->Next(1,&rnd,0); // we find last one (renderer)
    				hr = rnd->EnumPins(&pins);  // because data we are intersted in are pumped to renderers input pin 
    				hr = pins->Next(1,&pin, 0); // via Receive member of IMemInputPin interface
    	IMemInputPin*   mem  = 0;  hr = pin->QueryInterface(IID_IMemInputPin,(void**)&mem);
     
    if (!Receive_) 
    { 
      INT_PTR* p = 6 + *(INT_PTR**)mem;  
      VirtualProtect(&Receive_, 4, PAGE_EXECUTE_READWRITE, &no);
      *(INT_PTR*) & Receive_ =*p;
      VirtualProtect(p, 4, PAGE_EXECUTE_READWRITE,&no);   
      *p=(INT_PTR)Receive; 
    }
     
    	hr = ctrl->Run();   
     
    	while ( GetMessage(   &msg, 0, 0, 0 ) ) {  
    		TranslateMessage( &msg );   
    		DispatchMessage(  &msg ); 
    	}
    };

  5. #5
    Membre éclairé
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Points : 719
    Points
    719
    Par défaut
    Bonté divine quelle horreur ...
    Je me souviens que le code DirectShow est généralement assez horrible à voir, mais là ....

    L'idée c'est que la fonction Receive sera appellée lorsque des datas arriveront sur l'objet Pin représenté par Mem, pendant que ton "graph" fonctionne.
    Mais pour faire ça, ce source semble patcher la table de méthodes de l'objet. J'avais jamais vu un truc pareil avant, j'espère que tu as de bonnes raisons de l'utiliser.
    Quelqu'un peut me confirmer que ce que je dis est juste ? ça parait tellement incroyable que moi même j'ai du mal à croire ce que je vois.

Discussions similaires

  1. [MySQL] Que veut dire cette erreur
    Par jlb59 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 10/09/2011, 15h53
  2. Que veut dire cette erreur ?
    Par Invité dans le forum jQuery
    Réponses: 3
    Dernier message: 04/04/2011, 09h51
  3. Que veut dire cette syntaxe: (key == 13) && ente && ente();
    Par geekforever dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 25/10/2010, 21h32
  4. Que veut dire cette erreur (au runtime) ?
    Par corseb-delete dans le forum Général Java
    Réponses: 6
    Dernier message: 08/04/2008, 12h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo