[Débutant]Un tableau ASCII alimenté par des ComBSTR

Résolu
zegilooo Messages postés 4 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 24 septembre 2004 - 20 sept. 2004 à 15:30
zegilooo Messages postés 4 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 24 septembre 2004 - 24 sept. 2004 à 12:42
Bonjour,

je débute en C++ et plus particulièrement avec Windows.
Je cherche à alimenter un tableau au format ASCII avec des données récupérées d'un type ComBSTR.

Je connais les méthodes ASCtoBSTR et BSTRtoASC
J'ai crée un tableau string :

string * ListeCN[10];
// je lui alloue 10 éléments, mais il faudrait qu'il soit dynamique parceque je ne connais pas le nombre d'éléments qu'il contiendra

je veux le passer à cette méthode :
HRESULT PrintAllObjects(IADsContainer* pContainer, string * ListeCN);

hr =PrintAllObjects(pCont, *ListeCN );

dans PrintAllObjects :

HRESULT PrintAllObjects(IADsContainer* pContainer, string * ListeCN )
{
long tailleListeCN;
HRESULT hr;
char * TabElem;
CComBSTR sbstr;

// ici j'alimente "sbstr" puis

tailleListeCN = sizeof(*ListeCN);
tailleListeCN++;

BSTRtoASC( sbstr, &TabElem);

ListeCN[tailleListeCN] = TabElem;

évidement, ça, ça ne marche pas. Visual Studio me dit :
'BSTRtoASC' : aucune des surcharges 2 ne peut convertir le paramètre 2 à partir du type 'char **__w64 '
Pour mémoire :
void BSTRtoASC (BSTR str, char * strRet) {

if ( str != NULL ) {
unsigned long length = WideCharToMultiByte ( CP_ACP, 0, str, SysStringLen(str), NULL, 0, NULL, NULL );
strRet = new char[length];
length = WideCharToMultiByte ( CP_ACP, 0, str, SysStringLen(str), reinterpret_cast <char *>(strRet), length, NULL, NULL );
strRet[length] = '\0';
}
}

Je sais que ç'est pas du joli.
Mais si une bonne âme pouvait me débloquer de cette situation, je lui en serai reconnaissant.

6 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 sept. 2004 à 12:23
"Je n'ai pas trouvé de bon tuto sur les tableaux de chaine de caractère."

pas besoin de tuto pour ca, suffit de connaitre les tableau et les chaines de caracteres

"quel type de tableau est idéal pour contenir une liste de chaines ASCII de taille variable ( un tableau de chemins de documents par exemple ) et dont le nombre d'éléments est dynamique. "

typiquement un tableau dynamique de tableau dynamique de caractere

char **tab;

mais on gagnerais beaucoup (contiguite et acces plus direct) a connaitre la taille max des chaines (par exemple MAX_PATH) car on aurais plus qu'a allouer un tableau dynamique de tableaux de taille MAX_PATH +1 (ou un truc comme ca)

char (*tab)[MAX_PATH + 1];

tab = malloc( nb_elt * sizeof *tab );
...
3
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 sept. 2004 à 22:24
oui c'est pas du jolie ;)

serieux faidrais lire un cours sur les pointeurs/tableaux sinon tu vas jamais t'en sortir, la tu melange tout !

string * ListeCN[10]; c'est un tableau de pointeur sur string

et c'est quoi ce type string ? (a quoi ca correspond?)

le message d'erreur est clair, tu passes a BSTRtoASC un char ** (l'adresse de TabElem)

BSTRtoASC( sbstr, TabElem);

d'ailleur tu n'as pas allouer de buffer pour TabElem
0
zegilooo Messages postés 4 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 24 septembre 2004
21 sept. 2004 à 10:47
Oui c'est vrai que je veux aller plus vite que ce que j'apprend.
Je n'ai pas trouvé de bon tuto sur les tableaux de chaine de caractère.

En fait j'aimerai savoir.

- quel type de tableau est idéal pour contenir une liste de chaines ASCII de taille variable ( un tableau de chemins de documents par exemple ) et dont le nombre d'éléments est dynamique.

- comment l'alimenter avec des données ComBSTR.

Merci beaucoup de ton aide,
ZeGilooo.
0
zegilooo Messages postés 4 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 24 septembre 2004
21 sept. 2004 à 14:41
Merci de m'avoir mit sur une très bonne piste.

J'ai testé et ça ne fonctionne pas, mais je sens que je ne suis plus très loint maintenant.

j'ai fait :

#define MAXLONGCHAR 256 //longueur max des chaines de caractères
#define MAXNBELEM 200 //nombre max d'éléments dans un tableau

(S'il y a des noms de constantes plus standard, je suis prenneur)

et plus bas ...

char (*ListeCN)[MAXLONGCHAR+1];
ListeCN = malloc( MAXNBELEM * sizeof *ListeCN );

Là, le compilateur me dit
'=' : impossible de convertir de 'void *' en 'char (*)[257]'
je pense que je trouverai de la doc facilement sur malloc pour résoudre ça, non ?

[...]

long tailleListeCN;
char *TabElem;
CComBSTR sbstr;

[...]

BSTRtoASC( sbstr, TabElem);
ListeCN[tailleListeCN] = *TabElem;

Là c'est le problème, j'ai lu de la doc sur les pointeurs, et j'ai tenté de passer en param à BSTRtoASC un **TabElem, *TabElem, TabElem, &TabElem
ya rien pour le satisfaire :-(
pour le moment l'erreur est
'BSTRtoASC' : appel ambigu à une fonction surchargée

Un dernier petit coup de pouce ?
Un grand merci !
ZeGilooo.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 sept. 2004 à 17:02
'=' : impossible de convertir de 'void *' en 'char (*)[257]'

parce que apparament tu compile en c++ et en c++ ya pas de conversion implicite avec le void* (qui est le type generique en c)

soit tu compile en c (ce qui serais coherent), soit tu cast (mais la en c++ ce qui serais coherent c'est d'utiliser new )

BSTRtoASC( sbstr, TabElem); devrais marché si ca correspond bien a la fonction decrite plus haut

mais TabElem pointe sur qqchose de non valide

fais plutot

char TabElem[MAXLONGCHAR+1]; // ce qu'il faut en taille

fais attention

ListeCN[tailleListeCN] = *TabElem; ca ne fais surement pas ce que tu veux
0
zegilooo Messages postés 4 Date d'inscription lundi 20 septembre 2004 Statut Membre Dernière intervention 24 septembre 2004
24 sept. 2004 à 12:42
Encore une fois merci beaucoup pour ton aide qui me permet d'avancer si rapidement.
0
Rejoignez-nous