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

  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. 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