Convertir un bstr en char* et un char* en bstr

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 362 fois - Téléchargée 30 fois

Contenu du snippet

Utilisation de 2 fonctions de l'API Windows permettant de transtyper un BSTR (chaine UNICODE --> 1 caractère = 2 octets) en un CHAR* (chaine ASCII --> 1 caractère = 1 octet) et récpirpoquement...

Source / Exemple :


////////////////////////////////
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';
    }

}

	
////////////////////////////////
void ASCtoBSTR (char * str, BSTR * strRet) {
	
    if ( str != NULL ) {
        unsigned long length = strlen(str);
		
        int ResultLength = MultiByteToWideChar (
		    CP_ACP,
                                    MB_PRECOMPOSED,				
                                    reinterpret_cast <char *>(str),   
	                    length,	
                                    NULL,				
	                    0							); 

  • strRet = SysAllocStringLen( NULL, ResultLength);
MultiByteToWideChar ( CP_ACP, MB_PRECOMPOSED, reinterpret_cast <char *>(str), length,
  • strRet,
ResultLength ); } }

Conclusion :


Ces fonctions s'avèrent très utiles dans le développement d'un contrôle ActiveX (COM).

A voir également

Ajouter un commentaire

Commentaires

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
62
euh... y'a un soucis, là...

unsigned long length = WideCharToMultiByte( .....
// Pour un BSTR contenant "localhost", nLength en retour vaut 9
strRet = new char[length]; // On créé ici un tableau 9 cases, donc.
// ici on le rempli
length = WideCharToMultiByte ( ......
// nLength vaut ici toujours 9
// Et là, c'est le drame ! on demande à modifier la dixième case d'un tableau qui n'en comporte que 9...
strRet[length] = '\0';

j'ai donc fait:
unsigned long length = 1+WideCharToMultiByte( .....

et ca roule bien mieux...
Messages postés
2
Date d'inscription
jeudi 10 juin 2004
Statut
Membre
Dernière intervention
9 juillet 2004

Le code manque de commentaires mais m'a fait gagner de précieuses minutes :D
Merci ;)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.