Von System::String to Char*
-
Hallo,
Da ich mit MySQL++ Bibliotheken arbeite, die alle noch Charzeiger erwarten,
kommt es oft vor, dass ich einen System::String in einen Charzeiger umwandeln
muss.
Allerdings habe ich auch nach googlen und vielem Herumprobieren keine
passende Methode gefunden.
Es sollte irgendwie sowas hier moeglich sein:const char *db = (Convert::ToChar(this->txtdbname->Text));
Geht natuerlich nicht
Kann mir jemand helfen?
Vielen Dank
David
-
hatte ein ähnliches Problem, hab das dann schlussendlich so gelöst:
string MarshalString(String^ x) { using namespace Runtime::InteropServices; const char* chars = (const char*)(Marshal::StringToHGlobalAnsi(x)).ToPointer(); string os = chars; Marshal::FreeHGlobal(IntPtr((void*)chars)); return os; }
ist halt für std::string und nicht für const char*, das sollte aber kein Problem mehr sein
-
Vorher FAQ lesen:
[url]
http://www.c-plusplus.net/forum/viewtopic-var-t-is-158664.html
[/url]
-
Diese methode wird zumindest schonmal richtig compiliert.
Um zu testen ob es jetzt wirklich geklappt hat waere es auch noch gut, wenn man
wuesste wie man wieder zurueck kommt.
Also vom char* zum System::String.Unter Marshall, gibt es leider da keinen Befehler mehr fuer
-
Ahh zurueck ist ganz einfach:
const char *hey = "HALLO"; String ^strA = gcnew String(hey);
Leider funktioniert folgende prozedur dann doch nicht so:
System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s).ToPointer()
In diesem Fall ist 's' ein const char*.
Allerdings kommen immer zufaellige komische Zeichen beim konvertieren heraus.
Sicher, dass die geposteten Methoden funktionieren?
-
also bei mir tun sie es
hatte noch nie probleme damit..
-
Mist!
Jetzt google ich schon Ewigkeiten woran es liegen kann.
Habe hier mal was ganz simples gebastelt, was einfach gehen MUSS:System::String ^ name = "HALLO WELT"; IntPtr strptr = (System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(name)); const char* str = (const char*)strptr.ToPointer(); System::Runtime::InteropServices::Marshal::FreeHGlobal(strptr); const char *hey = str; String ^strA = gcnew String(hey); this->Text = strA;
Er konvertiert erst zu char und dann zurueck zu System::String.
Oben im Formular steht dann:ÈŸ
Ist vielleicht mein VS irgendwo falsch konfiguriert?
Kann mal wer meinen Code bei sich reinkopieren und testen?*Edit:
Ich hab das Gefuehl es liegt daran, weil ich die Adresse loesche bevor ich sie ausgebe... :D*
-
777 schrieb:
System::String ^ name = "HALLO WELT"; IntPtr strptr = (System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(name)); const char* str = (const char*)strptr.ToPointer(); System::Runtime::InteropServices::Marshal::FreeHGlobal(strptr); const char *hey = str; String ^strA = gcnew String(hey); this->Text = strA;
Das kann nicht gehen, da Du den strptr *freigibst* und ihn *anschliessend* verwenden willst...
Verlagere das "FreeHGlobal" ganz ans Ende..
-
Diese dunkle Ahnung ist mir gestern dann auch gekommen.
Jetzt geht es.Ich bin euch auf jedem Fall fuer eure Hilfe dankbar.
Das Forum macht seinem Namen echt alle Ehre: Irgendwer hat immer eine Antwort.Echt sehr geil! Ich weiss garnicht, wie ich ohne das Forum hier jemals C++ haette lernen koennen