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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 18 241 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

Boulator
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 ;)
Renfield
Messages postés
17280
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
21 juillet 2019
57 -
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...

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.