Conversion System::String* en std::string

Conversion System::String* en std::string - C++ - Programmation

Marsh Posté le 16-06-2005 à 09:50:16    

Bonjour
 je voulais faire cette conversion avec cette methode que j'ai trouve dans la MSDN :
 
void wDBA::MarshalString ( System::String* s, std::string& os )
 {
 
   
   using namespace System::Runtime::InteropServices;
   const char* chars =  
    (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   os = chars;
   Marshal::FreeHGlobal(System::IntPtr((void*)chars));
   
 }
 
Et j'ai testé comme suivant :
MarshalString ("123456789123456789",var_std_string)
 
J'ai une levée de l'exception StackOverFlowException , je ne sais pourquoi  
 
Pouriiez-vous m'aidez ?
 
Merci

Reply

Marsh Posté le 16-06-2005 à 09:50:16   

Reply

Marsh Posté le 16-06-2005 à 15:13:27    

ronin111 a écrit :

Bonjour

Code :
  1. void wDBA::MarshalString ( System::String* s, std::string& os )
  2. {
  3. ...
  4.     const char* chars =
  5.         (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();



 
Je connais pas ces APIs, mais à mon avis, StringToHGlobalAnsi te renvoies un objet qui se voit détruire dès que tu as fini d'exécuter cette ligne de code. Le pointeur retourné par 'ToPointer' n'est alors plus valide puisqu'il pointe vers le contenu d'un objet détruit.
 
Solution envisageable: déclarer un objet System::string (ou que sais-je) qui n'est détruit qu'une fois que tu as affecté le contenu à une std::string.


Message édité par Lam's le 16-06-2005 à 15:13:56
Reply

Marsh Posté le 16-06-2005 à 15:19:17    

Lam's a écrit :

Solution envisageable: déclarer un objet System::string (ou que sais-je) qui n'est détruit qu'une fois que tu as affecté le contenu à une std::string.


 
merci Lam's mais ou dois-je déclarer cet objet System::String ?

Reply

Marsh Posté le 16-06-2005 à 15:32:57    

Ah bah non, j'ai dit des conneries, StringToHGlobalAnsi renvoie un pointeur. Ca doit être un problème de sécurité ou de gc alors. Désolé. :(

Reply

Marsh Posté le 16-06-2005 à 15:56:02    

Lam's a écrit :

Ah bah non, j'ai dit des conneries, StringToHGlobalAnsi renvoie un pointeur. Ca doit être un problème de sécurité ou de gc alors. Désolé. :(


merci tout de meme

Reply

Marsh Posté le 16-06-2005 à 16:11:21    

juste une question : est ce que l'objet os est initialisé avant d'être passé à la fonction ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-06-2005 à 16:22:12    

Harkonnen a écrit :

juste une question : est ce que l'objet os est initialisé avant d'être passé à la fonction ?


no je declare only une variable de std::string que je passe à la méthode

Reply

Marsh Posté le 16-06-2005 à 16:24:48    

Je pige pas le rapport avec l'erreur. :gratgrat:
Peut être un problème avec l'objet temporaire passé en paramètre, car tu ne passes par un String *, mais un char *.
Change ta chaine "123456789123456789" pour S"123456789123456789".
Elle a lieu où l'exception ?


Message édité par HelloWorld le 16-06-2005 à 16:25:24

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-06-2005 à 16:45:14    

ronin111 a écrit :

no je declare only une variable de std::string que je passe à la méthode


la voilà l'erreur à mon avis : tu passes une référence à un objet non initialisé


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-06-2005 à 16:56:32    

HelloWorld a écrit :

Je pige pas le rapport avec l'erreur. :gratgrat:
Peut être un problème avec l'objet temporaire passé en paramètre, car tu ne passes par un String *, mais un char *.
Change ta chaine "123456789123456789" pour S"123456789123456789".
Elle a lieu où l'exception ?


 
Bonjour
 
using namespace System::Runtime::InteropServices;
   const char* chars =  
    (const char*)(Marshal::StringToHGlobalAnsi(s)).ToPointer();
   ===> os = chars; en faite l'exception est levé ici :
   Marshal::FreeHGlobal(System::IntPtr((void*)chars));  
 
Il n'arrive pas à allouer et il me dirige sur cette ce fichier xmemory  et precisement la :  
 
 
  // xmemory internal header (from <memory> )
#pragma once
#ifndef _XMEMORY_
#define _XMEMORY_
#include <cstdlib>
#include <new>
#include <xutility>
 
#pragma pack(push,8)
#pragma warning(push,3)
 
 #pragma warning(disable: 4100)
 
#ifndef _FARQ /* specify standard memory model */
 #define _FARQ
 #define _PDFT ptrdiff_t
 #define _SIZT size_t
#endif
 
 #define _CPOINTER_X(T, A)  \
 typename A::template rebind<T>::other::const_pointer
 #define _CREFERENCE_X(T, A) \
 typename A::template rebind<T>::other::const_reference
 #define _POINTER_X(T, A) \
 typename A::template rebind<T>::other::pointer
 #define _REFERENCE_X(T, A) \
 typename A::template rebind<T>::other::reference
 
_STD_BEGIN
  // TEMPLATE FUNCTION _Allocate
template<class _Ty> inline
 _Ty _FARQ *_Allocate(_SIZT _Count, _Ty _FARQ *)
 { // allocate storage for _Count elements of type _Ty
 ==>return ((_Ty _FARQ *)operator new(_Count * sizeof (_Ty)));
 }
 
 

Reply

Marsh Posté le 16-06-2005 à 16:56:32   

Reply

Marsh Posté le 16-06-2005 à 17:19:34    

Harkonnen a écrit :

la voilà l'erreur à mon avis : tu passes une référence à un objet non initialisé


Bah si il est initialisé. [:spamafote]
Il a un constructeur sans paramètres et toussa quoi.

Reply

Marsh Posté le 17-06-2005 à 09:55:57    

Si tu fais un cout de chars ça donne quoi ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 20-09-2005 à 08:52:31    

bonjour,
 
i was the same problem and can solve it changing the runtime library (project settings->c\c++\code generation) to /mdd.
In my case the problem was the mix of manage and unmanaged libraries.
 
This link splain  the diferents types of runtime library options (and more).
 
I hope this helps.
 
pardon par mon anglais mais mon français est pire (encore   ;) ), des salutations depuis Barcelone.
 
Àngel.

Reply

Marsh Posté le 20-09-2005 à 08:54:41    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed