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

Windows Discussion :

Allocation mémoire DCOM pour structure "complexe"


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut Allocation mémoire DCOM pour structure "complexe"
    Bonjour à tous,

    Voici quelques jours que je galère pour réaliser mes allocations mémoires, mon problème étant que ma structure peut contenir d'autres structures..
    Au niveau d'un composant(à l'intérieur d'un même binaire), tout se passe pour le mieux-je pense-, seulement, une fois transféré à un autre composant, la structure global est bien là et allouée correctement, par contre, la structure dans la structure ne ressemble plus à rien..

    Un petit exemple de code pour illustrer mes propos:

    D'abord, la structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    typedef struct{
    char*  NameVoiture;
    int      NumPlaque;
    }sVoiture;
    
    typedef struct{
    sVoiture   Voitures*;
    int          NbVoitures;
    char*     NomParking;
    }sParking
    Déclaration de l'IDL + l'appel côté client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // IDL:
    HRESULT GetVoitures([out] unsigned long* SizeStruct ,[out, size_is( ,*SizeStruct)] byte** m_Parking);
    
    // appel côté client:
    unsigned long SizeStruct;
    SizeStruct = sizeof(m_Parking);
    sParking* m_Parking = NULL;
    
    HRESULT hr = GetVoitures(&SizeStruct, (byte**)&m_Parking );
    Maintenant côté serveur, voici comment je remplis la structure:
    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
    ....GetVoitures(ULONG* cbOut, byte** p_voit)
    {
         
          *p_voit = (byte*)CoTaskMemAlloc(sizeof(sParking));
    	sParking* temp;
    	temp = reinterpret_cast<sParking*>( *p_voit );
            *cbOut = sizeof(sParking);
    
            ....
    
            temp->Voitures = CoTaskMemAlloc(temp->nbVoitures * sizeof(sVoitures));
    
            .....
    
           // Même principe pour le char* nom
           for(int i = 0; i < temp->nbVoitures; i++)
           {
               *cbOut += sizeof(sVoitures);
               *cbOut += strlen(nomdelavoiture)+1;
               temp->Voitures[i].NameVoiture = CoTaskMemAlloc(strlen(nomdelavoiture)+1);
           }
    
           ....
    
          // Donc ici, Côté Serveur, la structure semble être correctement remplie.
          // Par contre, lors du retour côté client, j'ai bien accès par exemple au nombre de voitures (présent à la 'racine' de la structure) mais par contre, je ne sais plus énumérer les voitures ni consulter leurs noms :(
    }
    Vous l'aurez compris, j'ai essayé de fournir un exemple le plus général et le plus simplifié possible..

    Ma première question: Je ne suis pas un familier de l'IDL ni de COM/DCOM, donc, est ce que mes initialisations vous semblent corrects?
    La façon dont je remplis ma structure côté serveur aussi?

    Ma deuxième question: Qu'est ce qui pourrait bien foirer?


    Merci à vous

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je me demande si ce n'est pas ta déclaration de structures qui manque d'information.
    Essaie un truc de ce genre:
    Code IDL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct st_Voiture {
    	[string] char*  NameVoiture;
    	int      NumPlaque;
    } sVoiture;
     
    typedef struct st_Parking {
    	[size_is(NbVoitures)] sVoiture   Voitures*;
    	int          NbVoitures;
    	[string] char*     NomParking;
    } sParking;
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    ....
    En réalité, ces définitions de structures sont dans un gros fichier Header (.h) qui est utilisé dans de nombreux projets. Donc, quand j'essaye de faire ce que tu dis, je n'arrive plus à compiler ce header (logique je pense, il n'a rien à voir avec IDL).

    Je vais essayer de définir mes structures dans l'IDL en ajoutant ce que tu me dis, et ensuite, de mapper de part et d'autres vers la structure C.

    Je te tiens au courant, certainement après avoir miam...

    Merci, bon appétit !

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pourquoi "mapper" ?

    Si le fichier .idl est fait correctement, le header généré devrait suffire...

    PS: Pense à donner un vrai nom à tes structures. Je n'en ai pas rajouté pour rien.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2006
    Messages : 76
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Pourquoi "mapper" ?

    Si le fichier .idl est fait correctement, le header généré devrait suffire...

    PS: Pense à donner un vrai nom à tes structures. Je n'en ai pas rajouté pour rien.
    Beaucoup de bêtises dans mes posts: effectivement pas besoin de mapper quoi que ce soit, et de plus, je m'y suis pris comme un manche parce que les 'spécialisations' (ça s'appelle comment au fait?) du type [string] et [size_is(nbqqchose)] sont très bien comprises par le compilateur C/C++...

    Sinon, ben je viens donc de refaire un test avec les ajouts que tu m'as conseillé et.. pas d'amélioration..
    en fait, j'ai l'impression que seul le premier CoTaskMemAlloc est pris en compte quand on revient dans le client, les autres semblent perdu..
    Une autre idée?

    Concernant les noms de structures, merci pour l'info, bien que cela soit déjà présent dans le cas dans ce programme, je les oublie assez souvent à titre privé.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour la note de vocabulaire: On appelle ça des attributs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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