2010-07-23 10 views
5

Je suis en train de convertir un wchar_t * en BSTR.C++: Convertit wchar_t * en BSTR?

#include <iostream> 
#include <atlstr.h> 

using namespace std; 

int main() 
{ 
    wchar_t* pwsz = L"foo"; 

    BSTR bstr(pwsz); 

    cout << SysStringLen(bstr) << endl; 

    getchar(); 
} 

Cette imprime 0, qui est inférieur à ce que je l'avais espéré. Quelle est la bonne façon de faire cette conversion?

Répondre

9

Vous devez utiliser SysAllocString (puis SysFreeString).

BSTR bstr = SysAllocString(pwsz); 

// ... 

SysFreeString(bstr); 

A BSTR est une chaîne gérée avec les caractères de la chaîne préfixé par leur longueur. SysAllocString alloue la quantité de stockage correcte et définit correctement la longueur et le contenu de la chaîne. Avec le BSTR correctement initialisé, SysStringLen devrait retourner la bonne longueur.

Si vous utilisez C++, vous pouvez envisager d'utiliser une classe de style RAII (ou même _bstr_t de Microsoft) pour vous assurer que vous n'oublierez aucun SysFreeString appels.

1

Je pense que le plus simple est d'utiliser soit

CString

ou

CComBSTR

les deux ont des méthodes qui ne ce que Charles a mentionné

+1

'CString' n'a pas _wrap_ a' BSTR', bien qu'il ait une méthode pour allouer un 'BSTR' à partir d'un' CString' ('.AllocSysString()'). Cependant, CString n'aide pas à la libération automatique d'un BSTR. –

+0

bien dans un sens il enveloppe la fonctionnalité de convertir en un BSTR qui était ce que l'OP voulait, mais techniquement vous avez raison, donc mon choix de mots n'était pas correct. –

2

SysStringLen() ne doit être utilisé sur BSTRs alloués par SysAllocString() fonctions de la famille. En l'utilisant, vous risquez de provoquer un comportement indéfini - le programme peut tomber en panne ou produire des résultats inattendus. Mieux encore utiliser des classes wrapper - ATL::CComBSTR ou _bstr_t.