Petite question sur _variant_t

Résolu
cs_azamharir Messages postés 55 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 novembre 2008 - 28 août 2007 à 18:26
milhandril Messages postés 55 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 11 décembre 2008 - 30 août 2007 à 08:28
salut
j'ai executé une requete SELECT avec ADO dans VC6. je peux afficher le resultat grace à :
     _variant_t var;
    var = recordset->Fields->GetItem(L"ville")->GetValue();// ville c'est un attribut de ma table
     cout << static_cast<char *>(_bstr_t(var.bstrVal))<< endl;
mais, ce que je veux c'est  mettre le resultat dans un char*. comment faire?
merci et à bientot

8 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
28 août 2007 à 19:17
Salut,
Tu peux utiliser la fonction API WideCharToMultiByte(). Elle permet de convertir proprement un BSTR en char*.
Exemple:
char buffer[200];
WideCharToMultiByte(0,0,var.bstrVal,-1,buffer,200,0,0);
3
milhandril Messages postés 55 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 11 décembre 2008
29 août 2007 à 09:27
Pour un champ texte tu peux également récupérer l'information par un objet _bst_t.

_bstr_t  bst;
char* recup;

bst= recordset->Fields->GetItem(L"ville")->GetValue();

recup=bst;

Par contre en terme d'optimisation je ne sais pas ce que ca vaut.
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
28 août 2007 à 18:37
Avec ta ligne  static_cast<char *>(_bstr_t(var.bstrVal)) tu récupères un pointeur qu'il faut copier car la chaîne est constante (me semble).

char* pBStr=static_cast<char *>(_bstr_t(var.bstrVal));
char pText[255 ou autre chose...];
strcpy(lpText,pBstr);

utiliser wchar_t partout si Unicode.
0
cs_azamharir Messages postés 55 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 novembre 2008
28 août 2007 à 18:52
salut
merci [auteurdetail.aspx?ID=255361 juju12], mais si je fait un cout de pText ou meme de pBStr j'obtiens juste des symbols bizzards. j'avais essayé ça et c'est le meme probleme.
quelqu'un peut me dire pourquoi l'affichage direct est correct alors que celui via une variable char * l'est moins?
0

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

Posez votre question
cs_azamharir Messages postés 55 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 novembre 2008
28 août 2007 à 20:01
salut
merci [auteurdetail.aspx?ID=295159 racpp], ça marche nikel. si on peut le faire autrement, n'hésitez pas à le dire.
salut et @++
0
cs_azamharir Messages postés 55 Date d'inscription jeudi 18 janvier 2007 Statut Membre Dernière intervention 1 novembre 2008
29 août 2007 à 18:05
salut
merci [auteurdetail.aspx?ID= 118008 milhandril] ça marche aussi.
et [auteurdetail.aspx?ID=295159 racpp] , tu peux répondre à [auteurdetail.aspx?ID =118008 milhandril] en ce qui concerne la solution la plus optimale?
merci à tous et à bientot.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
29 août 2007 à 20:02
Je pense qu'on n'a pas besoin de créer un nouvel objet _bstr_t car il existe déjà. C'est celui fourni dans le membre bstrVal du VARIANT. Il est donc préférable de récupérer juste son contenu afin de l'exploiter.
0
milhandril Messages postés 55 Date d'inscription mardi 10 juin 2003 Statut Membre Dernière intervention 11 décembre 2008
30 août 2007 à 08:28
Tout a fait d'accord avec toi. La déclaraction du nouvel objet je ne l'avais fait que dans un soucis de clarté. Après le fait d'avoir besoin ou non d'une variable temporaire dépend de chaque cas. Je me posais surtout la question par rapport à l'optimisation entre l'utilisation de l'opérateur surchargé dans mon exemple et l'utilisation de WideCharToMultiByte.
0
Rejoignez-nous