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 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
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 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 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"); } }
Au final, coté client, je récupère parfaitement ma matrice, mais pas mes régions.
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; };
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.
Partager