Conversion System::String* en std::string - C++ - Programmation
Marsh Posté le 16-06-2005 à 15:13:27
ronin111 a écrit : Bonjour
|
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.
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 ?
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é.
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
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 ?
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
Marsh Posté le 16-06-2005 à 16:24:48
Je pige pas le rapport avec l'erreur.
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 ?
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é
Marsh Posté le 16-06-2005 à 16:56:32
HelloWorld a écrit : Je pige pas le rapport avec l'erreur. |
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)));
}
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é.
Il a un constructeur sans paramètres et toussa quoi.
Marsh Posté le 17-06-2005 à 09:55:57
ReplyMarsh 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.
Marsh Posté le 20-09-2005 à 08:54:41
pardon, le link
http://msdn.microsoft.com/library/ [...] raries.asp
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