Casting(System::String^ nach consr char*) was läuft falsch
-
Hi was ist daran so falsch ???
Es wird zwar kein Fehler ausgegeben aber es wird nicht Connected.
Ich denke es liegt am Casten
SOCKET s;
SOCKADDR_IN addr;
s=socket(AF_INET,SOCK_STREAM,0);const char* chars =
reinterpret_cast<const char*>((System::Runtime::InteropServices::Marshal::StringToHGlobalUni(textBox1->ToString())).ToPointer());addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
addr.sin_addr.s_addr = inet_addr(chars);connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
-
Wenn du uns dann noch erzählst was
BlackZero schrieb:
System::Runtime::InteropServices::Marshal::StringToHGlobalUni()
ist können wir evtl. helfen. Aber ehrlich gesagt hat das net viel mit Standard C++ zu tun.
edit:
connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));
-
Weiss es eben selbs nicht hab dass auch blos aus einem Forum
Wie ist es denn Überhaubt möglich aus einem System::String^ ein const char* zu mchen
-
Ein System::String beinhaltet keine Information über sein Encoding. Wenn das Encoding bekannt ist kann man den System::String in ein byte-Array kopieren und dann dürfte das Casting kein Problem mehr sein, wobei man natürlich beachten muss, ob das Array vor der plötzlichen Speicher-Neu-Organisation des Garbage-Collectors geschützt und die Speicherposition "gepinnt" werden muss. Im Zweifelsfall bezüglich des Encodings würde ich es mal mit Encoding::Default::GetBytes probieren. Aber wie schon erwähnt, mit Standard C++ haben all diese Vorgänge nichts zu tun.
-
Hi, Danke.
Aber ich habe keine Ahnung wie ich dass anstellen soll, hast du mier ein Beispiel *liebrüberguck"
-
Hier ein Beispiel, das ohne Marshalling und Festpinnen auskommt, weil die String-Daten kopiert werden:
#include "stdafx.h" #include <iostream> using namespace System; int main(array<System::String ^> ^args) { System::String ^gruss = "Hallo"; array<unsigned char> ^managedArray = System::Text::Encoding::Default->GetBytes(gruss); unsigned char *test = new unsigned char[managedArray->Length + 1]; int i; for(i=0; i<managedArray->Length; ++i) test[i] = managedArray[i]; test[i] = 0; std::cout << test << std::endl; delete [] test; Console::ReadKey(true); return 0; }