Bonjour,

J'ai une application distribué qui permet de passer une structure via d'un PC à un autre via DCOM.

Ma structure est une interface DCOM composé d'autre interface, elles-mêmes composé d'interfaces et etc... jusqu'à arriver à des types simples.

En gros l'application cliente envoie la structure vers le serveur. Le serveur la copie et traite les données. Enfin, le client récupère la structure.

Mon problème est que j'arrive à envoyer le structure, mais je la récupère à moitié.

Pourtant, je fais la même chose coté client et serveur.

Code client: création de l'interface à envoyer.
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 
                TCOMITMatrixIntCOM matrice = CoTMatrixIntCOM::Create();
 
		matrice.set_nCols(nCols); 
		matrice.set_nRows(nRows);
		matrice.set_roiTop(roiTop);
		matrice.set_roiLeft(roiLeft);
		matrice.set_roiRight(roiRight);
		matrice.set_roiBottom(roiBottom);
 
		LPSAFEARRAY lpsa;
		lpsa = SafeArrayCreateVector(sizeof(int),0,data.size());
		long Valeur,Position;
		for(i=0; i<data.size(); i++){
			Position = i;
			Valeur = data[i];
			SafeArrayPutElement(lpsa, &Position, &Valeur);
		} 
		matrice.set_data(lpsa);
		SafeArrayDestroy(lpsa);
 
 
			// iRoi
		TCOMITVectorAnsiStringCOM iRoi = CoTVectorAnsiStringCOM::Create();
		for(i=0; i<roiList.size(); i++)
		{
			iRoi.set_element(i,roiList[i].c_str());
                }
 
 
			// currentRegion
		TCOMITRegionCOM cReg = CoTRegionCOM::Create();
		cReg.list = iRoi;
 
 
			// list (regions)
		TCOMITVectorAnsiStringCOM * iReg;
		TCOMITRegionCOM * reg;
		TCOMITVectorTRegionCOM listRegion = CoTVectorTRegionCOM::Create(); 
		for(i=0; i<regionList.size(); i++)
		{
			reg = new TCOMITRegionCOM;
			*reg = CoTRegionCOM::Create(); 
			iReg = new TCOMITVectorAnsiStringCOM;
			*iReg = CoTVectorAnsiStringCOM::Create();
 
			for(j=0; j<regionList[i].size(); j++)
			{
				iReg->set_element(j,regionList[i][j].c_str());
                        }
 
			reg->set_list((TVectorAnsiStringCOM*)*iReg);	
			listRegion.set_element(i,(TRegionCOM*)*reg);
		}
 
 
			// regions
		TCOMITRegionsCOM regions = CoTRegionsCOM::Create();
		regions.currentRegion = cReg;
		regions.list = listRegion;
 
 
			// Image
		TCOMITImageDataCOM image = CoTImageDataCOM::Create();
		image.iMatrix = matrice;
		image.regions = regions;
Code client: Envoi, traitement et retour.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
		TCOMIObjetRunCOM objetDistant = CoObjetRunCOM::CreateRemote(L"10.167.20.154");
		TImageDataCOM * imageResult;
 
		reponse = objetDistant.set_image((TImageDataCOM*)image);
		analyseReponse(reponse, "set_image");
	   	if(SUCCEEDED(reponse)){
			reponse = objetDistant.Run();
			analyseReponse(reponse, "Run");
			if(SUCCEEDED(reponse)){
				reponse = objetDistant.get_image(&imageResult);
				analyseReponse(reponse, "get_image");
			}
		}
Code serveur: Création de l'interface pour le retour des données
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
STDMETHODIMP TObjetRunCOMImpl::get_image(TImageDataCOM** Value)
{
  try
  {
	int i,j;
	HRESULT reponse;
 
 
		// iMatrix
	TCOMITMatrixIntCOM matrice = CoTMatrixIntCOM::Create();
 
	matrice.set_nCols(nCols); 
	matrice.set_nRows(nRows);
	matrice.set_roiTop(roiTop);
	matrice.set_roiLeft(roiLeft);
	matrice.set_roiRight(roiRight);
	matrice.set_roiBottom(roiBottom);
 
	LPSAFEARRAY lpsa;
	lpsa = SafeArrayCreateVector(sizeof(int),0,data.size());
	long Valeur,Position;
	for(i=0; i<data.size(); i++){
		Position = i;
		Valeur = data[i];
		SafeArrayPutElement(lpsa, &Position, &Valeur);
	} 
	matrice.set_data(lpsa);
	SafeArrayDestroy(lpsa);
 
 
		// iRoi
	TCOMITVectorAnsiStringCOM iRoi = CoTVectorAnsiStringCOM::Create();
	for(i=0; i<roiList.size(); i++)
		iRoi.set_element(i,roiList[i].c_str());
 
 
		// currentRegion
	TCOMITRegionCOM cReg = CoTRegionCOM::Create();
	cReg.set_list((TVectorAnsiStringCOM*)iRoi);
 
 
		// list (regions)
	TCOMITVectorAnsiStringCOM * iReg;
	TCOMITRegionCOM * reg;
	TCOMITVectorTRegionCOM listRegion = CoTVectorTRegionCOM::Create(); 
	for(i=0; i<regionList.size(); i++){
		reg = new TCOMITRegionCOM;
		*reg = CoTRegionCOM::Create(); 
		iReg = new TCOMITVectorAnsiStringCOM;
		*iReg = CoTVectorAnsiStringCOM::Create();
 
		for(j=0; j<regionList[i].size(); j++)
			iReg->set_element(j,regionList[i][j].c_str());
 
		reg->set_list((TVectorAnsiStringCOM*)*iReg);	
		listRegion.set_element(i,(TRegionCOM*)*reg);
	}
 
 
		// regions
	TCOMITRegionsCOM regions = CoTRegionsCOM::Create();
	regions.set_currentRegion((TRegionCOM*)cReg);
	regions.set_list((TVectorTRegionCOM*)listRegion);
 
 
		// Image  	
	TCOMITImageDataCOM imageResult;
	imageResult = CoTImageDataCOM::Create();
 
	reponse = imageResult->set_regions((TRegionsCOM*)regions);
	analyseReponse(reponse, "set_regions");
 
	reponse = imageResult->set_iMatrix((TMatrixIntCOM*)matrice);
	analyseReponse(reponse, "set_iMatrix");
 
	*Value = imageResult;
  }
  catch(Exception &e)
  {
    return Error(e.Message.c_str(), IID_IObjetRunCOM);
  }
  return S_OK;
};
Au final, coté client, je récupère parfaitement ma matrice, mais pas mes régions.

Alors qu'à l'envoi, je récupère tout. Et pourtant je fais la même chose!

Une idée?
Une question pour compléter le problème?

Merci d'avance pour toute réponse.