Probleme de fonction retournant du texte

[Résolu]
Signaler
Messages postés
2
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
2 juin 2006
-
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
-
bonjour à tous,

je suis débutant de chez Débutant et je cherche à modifier une dll écrite en C++ pour en augmenter ses fonctions.
Je cherche notamment à créér une fonction qui me retournerais du texte dans vb :
j'ai essayé de la déclarer par 

         #include <string>
et          std::string  _stdcall ReadAngle()
               {
                     return "TOTO";
               }
et là gros plantage dans VB : 
    Public Declare Function ReadAngle Lib "inpout32.dll" (ByVal Portadress As Integer) As Integer
   la ligne qui plante est:   Dir.Text = Str(ReadAngle("&H0379"))

pas de message d'erreur, ni moyen de comprendre ni de trouver la réponse.

Merci de votre aide

Anthropo

5 réponses

Messages postés
2
Date d'inscription
vendredi 11 avril 2003
Statut
Membre
Dernière intervention
2 juin 2006

merci beaucoup quelle rapidité.

J'ai pas tout compris mais je m'en tire avec ceci :

BSTR _stdcall ReadAngle(short PortAddress)
 {
 BSTR Message;
 char *buffer = "NE";
  Message = SysAllocStringByteLen(buffer , lstrlen(buffer));
   return Message;
  free(buffer);
 }


merci encore de ton aide

Anthropo





Anthropo
Messages postés
126
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
11 juillet 2006

Bonjour

aie aie aie

Il n y  a pas de correpondance entre les chaine C++ string et les chaines du VB.
Il faut que tu utilise un BSTR en retour

essaye un truc du genre

void _stdcall ReadAngle(BSTR *stringOut)
{

.... ton code
 

 char * buffer = new char[ size ];
*stringOut = SysAllocStringByteLen(buffer, size);

free(buffer);
}

avec dans buffer la chaine que tu veux echanger et size sa taille

TOCHE
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
tu a un problème dans ta fonction. Tu retourne quelque chose avant de libérer ta mémoire. Tu te trouve donc a quitter ta fonction avant de libérer la mémoire. Il faudrait faire:

BSTR _stdcall ReadAngle(short PortAddress)
 {
 BSTR Message;
 char *buffer = "NE";
  Message = SysAllocStringByteLen(buffer , lstrlen(buffer));
  free(buffer);
  return Message;
 }

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Ensuite, c'est étrange cette fonction : SysAllocStringByteLen. C'est de l'OLE non? Je comprend pas son fonctionnement. J'espère que la mémoire est bien allouer car sinon tu fais un free sans allocation. Ça pourrais entrainer certain problèmes.

___________________________________________
Les plus grands esprits trouvent toujours une solution
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Petite correction. Je sais pas pourquoi j'ai dit de mettre free avant return dans ta fonction. Je devais être saoul ou très fatigué. Peu importe. Le problème est toujours la. Tu quitte ta fonction mais tu libère après le return donc la libération ne se fera jamais. Donc il faudrais que tu libère ta mémoire en dehors de ta fonction comme ceci:

char *buffer;
buffer = ReadAngle(128);
...
free(buffer);

Ou encore tu modifie ta fonction de sorte que la mémoire soi alloué et libéré en dehors de celle-ci (par exemple, tu alloue la mémoire à une variable, tu passe cette variable à ta fonction en paramètre et ta fonction s'occupe de modifier la chaine de caractère) mais il faut absolument que tu libère la mémoire, c'est l'important.
___________________________________________
Les plus grands esprits trouvent toujours une solution