Bonjour,

Je cherche à créer un SafeArray de BSTR afin de renvoyer un tableau contenant des adresses IP via COM.

Pour l'instant, je fais comme ça, mais ça ne marche pas :
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
//Méthode renvoyant un tableau d'adresse IP
STDMETHODIMP TGestionnaireCOMImpl::get_serverList(LPSAFEARRAY* list)
{
	LPSAFEARRAY lpsa;
	WideString tmp;
	BSTR addrTmp;
	AnsiString texte;
 
	//Ouverture du fichier .ini contenant les @IP
	TIniFile * iniFile = new TIniFile(ChangeFileExt(Application->ExeName,".INI"));
 
	//lecture
	TStringList * section = new TStringList;
	iniFile->ReadSection("serverAddress", section);
 
	//on créé le vecteur (SafeArray)
	lpsa = SafeArrayCreateVector(VT_BSTR, 0, section->Count);
	if(lpsa == NULL)
	{
		texte = "lpsa = NULL";
		Form3->Memo1->Lines->Add(texte); 
	}
 
	//on le remplit
	long Position;
	for(int i=0; i<section->Count; i++)
	{
		Position = i;
		tmp = section->operator [](i);
		addrTmp = tmp.c_bstr();
 
		HRESULT reponse = SafeArrayPutElement(lpsa, &Position, &addrTmp);
		analyseReponse(reponse, "SafeArrayPutElement");
	}
 
	//on copie et on detruit
	SafeArrayCopy(lpsa, list);
 
	SafeArrayDestroy(lpsa);
 
	return S_OK; 
}
addrTemp contient bien une @IP. Mais au premier SafeArrayPutElement le programme plante.

Je pense que le problème vient du fait que quand je créé le tableau, je lui indique que la taille des "cases" est VT_BSTR et quand je le rempli, le BSTR est plus gros que la case alloué.

Si quelqu'un sait comment faire...