IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Fonctions de conversion BSTR


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 78
    Par défaut Fonctions de conversion BSTR
    bonjour tout le monde,
    je suis tonber sur un source qui permet de convertir un BSTR en chaîne ordinaire et vice-versa ? dans ces fonction il y a une multitude de fonction qui sont utilisé mais que je ne comprend pas tre bien meme avec l'aide ( en plus el est en anglais !)
    voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    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);
        }
    }
    jaimerai une petite explicatoin pour les fonction :
    WideCharToMultiByte, reinterpret_cast, strRet, MultiByteToWideChar, SysAllocStringLen.

    merci pour toute information

  2. #2
    Membre émérite Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Par défaut
    Pour passer de l'Unicode vers l'ANSI et vice-versa il existe les API WideCharToMultiByte et MultiByteToWideChar.

    ANSI->Unicode
    Trouver la taille finale pour réserver le buffer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Size = MultiByteToWideChar (CP_ACP, 0, szAnsi, -1, NULL, 0) ;
    //Ensuite vous faites un:
     LPWSTR wUnicode = new WCHAR[Size] 
    //puis vous effectuez la conversion
    MultiByteToWideChar (CP_ACP, 0, szAnsi, -1, wUnicode, Size) ;
    Unicode->ANSI
    Trouver la taille finale pour réserver le buffer :

    Size = WideCharToMultiByte(CP_ACP, 0, wUnicode, -1, NULL, 0, NULL, &bTemp) ;
    Ensuite vous faites un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LPSTR szAnsi = new char[Size] puis vous effectuez la conversion
    WideCharToMultiByte(CP_ACP, 0, wUnicode, -1, szAnsi, Size, NULL, &bTemp) ;
    Attention les API Windows attendent une longueur de buffer en caractères et non pas en octets. Donc méfiance avec sizeof qui retourne le nombre d'octets. L'astuce est d'utiliser sizeof(chaine)/sizeof(TCHAR), par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TCHAR Buffer[512];
    GetModuleFileName(NULL, Buffer, sizeof(Buffer)/sizeof(TCHAR));

    reinterpret_cast
    c'est'opérateur de transtypage le plus dangereux. Sa syntaxe est la même que celle des autres opérateurs de transtypage dynamic_cast, static_cast et const_cast :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    reinterpret_cast<type>(expression)
    Cet opérateur permet de réinterpréter les données d'un type en un autre type. Aucune vérification de la validité de cette opération n'est faite. Ainsi, les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    double f=2.3;
    int i=1;
    const_cast<int &>(f)=i;
    sont strictement équivalentes aux lignes suivantes : 
    double f=2.3;
    int i=1;
    *((int *) &f)=i;
    L'opérateur reinterpret_cast doit cependant respecter les règles suivantes :


    il ne doit pas permettre la suppression des attributs de constance et de volatilité ;

    il doit être symétrique (c'est-à-dire que la réinterprétation d'un type T1 en tant que type T2, puis la réinterprétation du résultat en type T1 doit donner l'objet initial).

    SysAllocStringLen
    SysAllocStringLen alloue une chaîne puis copie le nombre spécifié de caractères de la chaîne spécifiée. SysAllocStringLen ne validant pas le nombre de caractères à copier, le code risque de se bloquer si le nombre de caractères spécifié est supérieur au nombre de caractères dans la chaîne. Vous devez passer un nombre correct de caractères dans la fonction SysAllocString pour éviter une saturation de la mémoire tampon.


    L'exemple de code suivant génère cet avertissement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <windows.h>
     
    void f ()
    {
      BSTR bstr;
      bstr = SysAllocStringLen(L"txt", 5); // warning 6327
      // code...
      SysFreeString(bstr);
    }
    Pour corriger cet avertissement, passez la longueur de chaîne correcte, comme indiqué dans le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <windows.h>
    void f()
    {
      BSTR bstr;
      wchar_t *greeting=L"Hello, World!";
     
      bstr = SysAllocStringLen(greeting, sizeof(greeting));
      // code...
      SysFreeString(bstr);
    }

Discussions similaires

  1. Fonction de conversion de nombre en lettres
    Par david_chardonnet dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2021, 17h51
  2. Fonction de conversion de volume
    Par soso78 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 23/08/2005, 21h12
  3. [TestStand] Fonction de conversion...
    Par capblans dans le forum Autres langages
    Réponses: 4
    Dernier message: 26/04/2005, 08h58
  4. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  5. Fonction de conversion de COLORREF en hexadécimal?
    Par charliejo dans le forum MFC
    Réponses: 4
    Dernier message: 21/02/2004, 18h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo