Probleme de fonction retournant du texte

Résolu
cs_anthropo Messages postés 2 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 2 juin 2006 - 2 juin 2006 à 16:43
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 - 4 juin 2006 à 23:56
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

cs_anthropo Messages postés 2 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 2 juin 2006
2 juin 2006 à 17:16
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
3
ricky78 Messages postés 126 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 11 juillet 2006
2 juin 2006 à 16:58
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 juin 2006 à 17:30
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
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
2 juin 2006 à 17:34
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
4 juin 2006 à 23:56
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
0
Rejoignez-nous