begin process at 2012 02 13 13:38:32
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Driver

 > 

Pointeur sur structure variable


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pointeur sur structure variable

mercredi 26 novembre 2008 à 12:15:23 | Pointeur sur structure variable

HeavenForsaker

Bonjour,

J'ai un code qui ressemble au suivant:

typedef struct _STRUCT1 {
    DWORD dwData1;
    DWORD dwData2;
    DWORD dwData3;
} STRUCT1, *LPSTRUCT1;

typedef struct _STRUCT2 {
    DWORD dwData1;
    DWORD dwData2;
    DWORD dwData4;
    DWORD dwData5;
    DWORD dwData3;
} STRUCT2, *LPSTRUCT2;

void funct(PVOID pStruct, DWORD dwMask)
{
    LPSTRUCT1 lps1;
    LPSTRUCT2 lps2;

    switch (dwMask)
    {
        case 1:
            lps1 = (LPSTRUCT1)pStruct;
            if (lps1->dwData3 == 2)
            {
                //traitement;
            }
            break;

        case 2:
            lps2 = (LPSTRUCT2)pStruct;
            if (lps2->dwData3 == 2)
            {
                //traitement;
            }
            break;
    }
}

Y a t-il moyen de simplifier ce code avec quelque chose comme ça :

void funct(PVOID pStruct, DWORD dwMask)
{
    PVOID pStructure;

    switch (dwMask)
    {
        case 1:
            pStructure = (LPSTRUCT1)pStruct;
            break;

        case 2:
            pStructure = (LPSTRUCT2)pStruct;
            break;
    }

    if (pStructure->dwData3 == 2)
    {
        //traitement;
    }
}
jeudi 27 novembre 2008 à 12:19:18 | Re : Pointeur sur structure variable

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Bin sans mettre dwData3 au même offset dans les deux structures, je ne vois pas comment ce serait possible. Un genre d'héritage quoi, mais je suppose que tu connais la méthode.

Dans le cas suivant CHILD1 et CHILD2 ont toutes les deux la données intéressante (dwData3, mais en fait le nom n'a aucune importance) au même offset, c'est à dire 8 octets après leur adresse (Attention à l'alignement dans le cas de champs avec des types hétérogènes comme ici).

On peut donc accèder à ce membre en castant les strucutres en PARENT, peut importe que ce soit des CHILD1 ou des CHILD2 en mémoire.

C'est un mécanisme similaire qui est très souvent utilisé en prog orientée objet : les classes filles ont les membres de leurs parentes suivis de ses propres membres.

typedef struct _CHILD1 {
    DWORD dwData1;
    DWORD dwData2;
    DWORD dwData3;
} CHILD1, *LPCHILD1;

typedef struct _CHILD2 {
    WORD wData1;
    WORD wData2;
    DWORD dwData4;
    DWORD dwData3;
} CHILD2, *LPCHILD2;

typedef struct _PARENT{
    char cReserved[8];
    DWORD dwData3;
} PARENT, *LPPARENT;
jeudi 27 novembre 2008 à 20:14:19 | Re : Pointeur sur structure variable

HeavenForsaker

Salut rt15,

Merci beaucoup pour ta réponse. Cette solution aurait été parfaite mais malheureusement les données qui m'intéressent sont à des offsets différents. Je crois que je n'aurais pas d'autre choix que de dupliquer le code pour chaque structure.

++


Cette discussion est classée dans : dword, pstruct, dwdata3, lpstruct1, lpstruct2


Répondre à ce message

Sujets en rapport avec ce message

thread et paramètres [ par sena ] sujet : thread et paramètresbonjour,voila j'ai fait un petit programme de test pour l'éxcution de thread.je souahiterais faire la même chose en passan Conversion d'un DWORD en chaîne de caractères [ par annplop ] Bonjour,je code en c++ (avec visual c++ 6), et j'ai besoin de convertir une variable de type DWORD en chaîne de caractères.Est-ce possible et si oui c Pb avec CreateThread !!! [ par jujunio ] Bonjour, J'ai toujours le même pb avec la création d'une tâche!!MON PROG :DWORD WINAPI Blick::lireCOM(LPVOID ptr){ while (1){...}}int Blick::appli(){ REG_DWORD [ par Xentor609 ] Lorsque je recupere la valeur d'une clé avec RegEnumValue,celle-ci doit etre stockée dans un BYTE. Quand le type de la valeur recupérée est un REG_SZ, ScannerIP() [ par JCpp ] Il y a-t-il un moyen d'ouvrir 100 Theard sans écrire :DWORD WINAPI ScaneIP1(LPVOID param){..}DWORD WINAPI ScaneIP2(LPVOID param){..}. Problème de compilation d'une Dll [ par DrUn ] Bonjour, J'ai une Dll qui a été compilée par visual c++ il y a quelques temps. Cette Dll fait du WinHTTP. Elle n'a pas été modifiée et mon SDK non plu Prob de thread [ par sebastienbro ] Bonjour, j'ai un problème avec des thread, je n'arrive pas a en créer un :(Voici mon code : HANDLE hThread1;DWORD dwThreadId1;DWORD WINAPI T RegOpenKeyEx [ par guitoulefoux ] Bonjour,Pourriez vous m'aider a corriger mon erreur.Voici mon bout de code :TCHAR MenDema[1024];[...]HKEY hKey;RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWA transformer un jour du mois en DWORD [ par myocean ] Dans le cas de la structure AT_INFOla variable DaysOfMonth est au format DWORD et elle recoit comme paramêtre des bit où le bit 0 est le 1er du mois GetFileVersionInfoSize, probleme de link [ par gege1024 ] en utilisant : GetFileVersionInfoSizej'ai un probleme de lien, et je ne sais pas d'ou ca vient (# include ???) DWORD info; DWORD toto; info =


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,546 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales