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 :

besoin d'explications sur un code


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut besoin d'explications sur un code
    Bonjour,
    quelqu'un pourrait-il m'expliquer le code suivant en détail ?
    Merci pour vos réponses.


    #include <windows.h>
    #include <stdio.h>
    BOOL WINAPI Dllmain(
    HINSTANCE hinstDLL,
    DWORD fdwReason,
    LPVOID lpvReserved)
    {
    }

    void _stdcall longB(long nb1,BYTE *pt2);
    void _stdcall longB( long nb1,BYTE *pt2)
    {
    BYTE *pt1;
    pt1=(LPBYTE)&nb1;
    memcpy(pt2,pt1,4);
    }

  2. #2
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 75
    Points : 160
    Points
    160
    Par défaut
    la fonction longB copie le contenu de pt2 dans une zone mémoire qui a pour adresse nb1.

    Et ce n'est pas ce que j'ai vu de plus propre.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par NAHIAG
    quelqu'un pourrait-il m'expliquer le code suivant en détail ?
    Commentaires :
    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
     
    /* Code d'une DLL Windows */
    #include <windows.h>
    #include <stdio.h>
     
    /* fonction d'init appelee quand la DLL est chargee. */
    BOOL WINAPI Dllmain (
                           HINSTANCE hinstDLL,
                           DWORD fdwReason,
                           LPVOID lpvReserved)
    {
       /* ne fait rien... */
    }
     
    /* interface de longB() (devrait être dans un .h...) 
     
     
       Cette fonction est publique, mais son interface est 
       au format Microsoft C pour Windows. 
       C'est curieux pour une fonction de DLL...
       
       Elle recoit 2 parametres :
       
       nb1 de type long
       pt2 de type pointeur sur BYTE (probablement unsigned char)
     
    */
    void _stdcall longB (long nb1, BYTE * pt2);
     
    /* implementation de longB() */
    void _stdcall longB (long nb1, BYTE * pt2)
    {
       /* definit un pointeur sur BYTE non initialise. */
       BYTE *pt1;
     
       /* La partie la plus etrange de ce code (AMA, c'est un bug) 
       
       inialise pt1 avec l'adresse d'un parametre convertie en adresse de BYTE.
       
       C'est techniquement possible, mais probablement inutile.
       
       */
       pt1 = (LPBYTE) & nb1;
     
       /* copie les 4 premiers bytes pointes par p1 dans le parametre. */
       memcpy (pt2, pt1, 4);
    }
    A mon avis, c'est un bug. Quel est le but avoué de cette fonction ?
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Seb_de_lille
    la fonction longB copie le contenu de pt2 dans une zone mémoire qui a pour adresse nb1.
    Tu le crois vraiment ?
    Ce serait vrai si il n'y avait pas ce '&'.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    le but de cette dll est de transformer une valeur saisie de type long (dans un prog en vb) et de la convertir en byte sur 4 octets.
    merci pour le commentaire.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par NAHIAG
    le but de cette dll est de transformer une valeur saisie de type long (dans un prog en vb) et de la convertir en byte sur 4 octets.
    Ca n'a aucun sens. Sous Windows, un long est une séquence de 4 octets. Il n'y a rien à convertir.

    Essaye de décrire précisément le problème que tu as à résoudre. AMA, tu te trompes de solution.

    Nota : je ne pense pas que VB accepte l'interface stdcall... Il faudrait plutôt WINAPI...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    la donnée saisie de type long doit être envoyée sur le réseau par un contrôle winsock .winsock n'envoie que les byte et les string c'est pour ça que la conversion avec la dll est effectuée.(A mon avis)
    OK pour winapi.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Je dirais que cette fonction fait un peu n'importe quoi.
    En fait elle met l'adresse de nb1 dans un buffer. Mais comme nb2 est une adresse locale (dans la pile), cette valeur n'aura plus de sens une fois sorti de la fonction....

    Si on est sur que pt2 est bien aligné, on peut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void _stdcall longB( long nb1,BYTE *pt2)
    {
      *(long*)ptr2 = nb1;
    }

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par NAHIAG
    la donnée saisie de type long doit être envoyée sur le réseau par un contrôle winsock .winsock n'envoie que les byte et les string c'est pour ça que la conversion avec la dll est effectuée.(A mon avis)
    OK pour winapi.
    C'est pas ça du tout qu'il faut faire. Pour transmettre une donnée binaire, il faut la convertir au format 'réseau', c'est à dire MSB en tête. Pour faire ça, il y a les fonctions portables htons() (16-bit) et htonl() (32-bit). Ces fonctions font partie du 'paquet' Winsock2.

    Je suis à peu près sûr que VB a un équivallent et qu'il est inutile de créer cette DLL.

    En gros, il faut faire (pseudo-code):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN
       LONG data := 1234
       LONG data_network := htonl(data)
       BYTE buffer[4]
       memcpy (buffer, @long_data, 4)
       send (fd, buffer, 4)
    END
    La fonction de conversion en C pour Win32 pourrait être comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <winsock2.h>
    #include <string.h>
     
    void long2net (unsigned char a[4], unsigned long val)
    {
       unsigned long datanet = htonl(val);
       memcpy (a, &data_net, 4);
    }
    Je te laisse faire l'encapsulation en DLL si nécessaire...
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/03/2014, 09h54
  2. besoin d'explication sur un code
    Par joelulrich dans le forum Débuter
    Réponses: 5
    Dernier message: 06/11/2010, 18h44
  3. Besoin d'explications sur un code
    Par poustiquette dans le forum Langage
    Réponses: 3
    Dernier message: 20/09/2008, 20h04
  4. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  5. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15

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