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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 738 fois - Téléchargée 31 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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
27 déc. 2007 à 11:31
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...
Boulator Messages postés 2 Date d'inscription jeudi 10 juin 2004 Statut Membre Dernière intervention 9 juillet 2004
9 juil. 2004 à 11:13
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.