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;
    }
    

Log in to reply