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:
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
11 typedef struct{ char* NameVoiture; int NumPlaque; }sVoiture; typedef struct{ sVoiture Voitures*; int NbVoitures; char* NomParking; }sParking
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 // 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 );
Vous l'aurez compris, j'ai essayé de fournir un exemple le plus général et le plus simplifié possible..
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 :( }
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
Partager