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

VB 6 et antérieur Discussion :

Dll C++ - Caractère de fin de chaine


Sujet :

VB 6 et antérieur

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Dll C++ - Caractère de fin de chaine
    Bonjour,

    Tout d'abord, toutes mes excuses si je ne poste pas dans la bonne section...

    Voilà mon soucis :

    J'ai un programme VB qui appelle une Dll développée en C++

    Tout se passe à peu près bien, c'est à dire qu'en fonction de paramètres en entrée, je recois bien des paramètres en sortie (chaine de caractères)

    Le problème est que mes chaines de caractères sont terminée par un symbole étrange, représenté sous la forme d'un carré quand je suis en debug.

    J'ai essayé de renvoyer le code ascii de ce caractère, ca me met la valeur 0

    Et en faisant un replace de char(0) sur ma chaine, ca ne fonctionne pas.

    Pour info, il semblerait que les paramètres renvoyés par C++ sont des LPSTR.

    Merci par avance de votre aide !!!!

  2. #2
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Il ne faut pas remplacer le Char(0), c'est la fin de la chaine.
    détectable avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Supposition de la fonction...
    Dim MaChaine as string
    Ret%= LeNomDeFontion( MaChaine, les autres paramètres)
    MaChaine= left(MaChaine, Ret%-1)
    A+

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci de ta réponse.

    J'avais pensé à cette solution, mais le tout est de savoir si cela va marcher de facon universelle.

    Je m'explique :

    La dll est développée par l'un de mes clients. Et il fort possible que cette dll évolue...

    Et dans ce cas, supprimer le dernier caractère supprimera peut etre quelque chose d'important...

    Désolé si je ne suis pas clair...

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Arf...

    Je viens peut etre de trouver une solution...

    Je ne connaissais pas la constante vbNullChar !!!

    A priori, en faisant un replace, cela fonctionne... A tester...

    Question subsidiaire : voyez vous des contre indications à utiliser un replace de vbNullChar ?

    Ex :

    MaString = Replace(MaString, vbNullChar, "")

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Si c'est clair, mais c'est toujours la fin de la chaine c'est inhérant aux appels par API et même si elle est perso c'est la même chose. De toutes façons, les données suivantes ne veulent rien dires et sont ce qu'il y a dans la mémoire.

  6. #6
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Citation Envoyé par waw_41 Voir le message
    Arf...

    Je viens peut etre de trouver une solution...

    Je ne connaissais pas la constante vbNullChar !!!

    A priori, en faisant un replace, cela fonctionne... A tester...

    Question subsidiaire : voyez vous des contre indications à utiliser un replace de vbNullChar ?

    Ex :
    Regarde le contenu de la variable après !!!

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    - il s'agit bien du caractère chr(0)
    - un replace du chr(0) par rien sur la chaîne récupérée ne sert à rien, puisque la chaîne récupérée, précisément, a déjà exclu le caractère chr(0)

    ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub Command1_Click()
     toto = "aaaa" & Chr(0)
     MsgBox toto & "b"
    End Sub
    le msgbox n'affichera (et pour cause) jamais le b

    regardons maintenant ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Command3_Click()
     toto = "aaaa" & Chr(0) & "b"
     Dim titi() As Byte
     titi() = StrConv(toto, vbFromUnicode)
     For i = 1 To UBound(titi)
       MsgBox titi(i)
     Next
     MsgBox "et pourtant, toto = " & toto
    End Sub
    et nous voyons bien que tant le caractère chr(0) que le caractère b sont présent dans le tableau de bytes, mais pas récupérables dans toto.

    J'espère que ces 2 exermples t'auront éclairé...

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci à tous pour vos réponses, j'ai bien compris le problème maintenant.

    Par contre, après quelques tests le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaString = Replace(MaString, vbNullChar, "")
    semble très bien fonctionner.

    LeForestier, si tu es dans le coin, peux tu m'expliquer la raison de ton

    Regarde le contenu de la variable après !!!
    J'ai effectivement regarder le contenu de ma variable, et tout me semble ok...

  9. #9
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bien, Waw_41,


    Mais fais gaffe avec les caractères chr(0) ... il y a quelquefois des surprises.

    Je préfère donc que tu sois bien "impreigné" de certains mécanismes...

    Reprenons l'exemple précédent et transformons le un peu ...

    Regarde :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Command1_Click()
     toto = "aaaa" & Chr(0) & "b"
     Dim titi() As Byte
     titi() = StrConv(toto, vbFromUnicode)
     toto = ""
     For i = 0 To UBound(titi)
       If titi(i) <> 0 Then toto = toto & Chr(titi(i))
     Next
     MsgBox toto
    End Sub
    et cette fpois-ci tu as zigouillé ton chr(0) ... et tu en aurais également zigouillé 2, s'il y en avait eu 2 à la suite.

    Assimile celà... (c'est intéressant, non ?)

    Une fois cette partir bien assimilée, nous co,tinuerons...

    A +

  10. #10
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Ayé ?

    Bon...
    Nous avons compris le principe.

    Il ne nous reste plus qu'à en profiter

    Tiens, pendant que nous y soùùes, mettons carrément 2 chr(0) à la suite, juste pour vérifier que nous nous en sortitons malgré tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Command3_Click()
     toto = "aaaa" & Chr(0) & Chr(0) & "b"
     titi = Split(toto, Chr(0))
     toto = ""
     For i = 0 To UBound(titi)
       toto = toto & titi(i)
     Next
     MsgBox toto
    End Sub
    Amitiés.

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Citation Envoyé par waw_41 Voir le message
    Merci à tous pour vos réponses, j'ai bien compris le problème maintenant.

    Par contre, après quelques tests le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaString = Replace(MaString, vbNullChar, "")
    semble très bien fonctionner.

    J'ai effectivement regarder le contenu de ma variable, et tout me semble ok...
    Tu a eu de la chance, ça dépend du contenu mémoire qui se trouve après le chr(0)
    Une variable est initialisée à SA LONGEUR, mais dans une API (dll) tu doit passer un buffer qui est de longeur suffisante pour contenir la chaine d'ou..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim MaChaine as string * 150
    Que théoriquement tu doit initialiser avant l'appel de la fonction, voilà la différence entre une dll et une variable donnée comme exemple par ucfoutu.
    C'est alors que tu doit voir ta variable quand tu enlève le chr(0)
    A+
    Edit:
    Petite rectification,
    C'est alors que tu doit voir ta variable quand tu enlève le chr(0) ou pas.
    et dans mon exemple Ret% te renvoi la longueur REEL de la variable (pas de -1)

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    C'est niquel tout ca !!!!

    Merci à tous pour votre aide !!!!

Discussions similaires

  1. Caractère de fin de chaine par défaut C#
    Par charter dans le forum C#
    Réponses: 7
    Dernier message: 14/05/2009, 18h54
  2. [Toutes versions] Ajouter une chaine de caractère à la fin d'une autre chaine
    Par esstin dans le forum Excel
    Réponses: 2
    Dernier message: 02/05/2009, 15h54
  3. [RegEx] pattern en fin de chaine de caractères
    Par Martyin dans le forum Langage
    Réponses: 1
    Dernier message: 09/08/2008, 11h10
  4. [RegEx] Supprimer les caractères en fin de chaine ?
    Par tintin72 dans le forum Langage
    Réponses: 8
    Dernier message: 05/04/2008, 12h15
  5. Rajout de caractère à la fin d'une chaine
    Par horneth dans le forum VB.NET
    Réponses: 9
    Dernier message: 02/02/2007, 17h20

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