char* ist nicht vollständig

  • Hallo,

    ich habe wahrscheinlich ein etwas selteneres anliegen. Ich versuche grade über c++ eine c# dll anzusprechen. Ich versuche mit der Hilfe eines Strings eine Byte Array zu übermitteln da ich keine bessere Lösung gefunden haben eine Byte Array von C# in C++ zu benutzten. Dieses sieht wie folgt aus.


    C#

    Code
    [DllExport(ExportName = "ByteTest", CallingConvention = CallingConvention.StdCall)]
            static public string ByteTest()
            {
                ByteBuffer buffer = new ByteBuffer();
                buffer.WriteString("Test");
                byte[] data = buffer.ToArray();
                buffer.Dispose();
                string datas = System.Text.Encoding.ASCII.GetString(data);
                return datas;
            }


    C++


    So nun zu meinen Problem:

    Ich habe mal mitschreiben lassen was für ein String bei C# aus geht und in C++ ankommt:


    C# ausgehend (Variable datas)


    C++ ankommend (in log Funktion)


    Nun stellt sich mir die Frage was habe ich falsch gemacht ??? Oder gibt es noch eine bessere Möglichkeit eine Byte Array zu übermitteln. Ich bin Realtiv neu in Unreal bzw c++ ich habe vorher immer mit C# gearbeitet (in Untiy) doch wir haben uns entschieden auf die Unreal zu wechseln und ich möchte versuchen über solch einen Port schon bereits geschriebenen Code aus untiy teilweise zu übernehmen (Komplett eigenes MP Server System.)


    Edit: Bilder bei ausgehend und ankommend hinzugefügt da es bei den Zitat nicht erkennbar war.

  • Hallo,


    danke für die schnelle Antwort. Habe alles dementsprechend geändert doch nun stürzt beim Test der Unreal Editor ab.


    Der Editor gibt mir vollende Zeile an (mit -> gekennzeichnet.)



    hab ich was falsch gemacht oder geht es einfach nur nicht. Beim Erstellen des Projektes war alles i.O. doch beim testen sofortiger absturzt.

  • Hallo,


    Ansonsten würde ich jetzt noch versuchen, das in ein c++ Projekt ohne Unreal zu versuchen, ich denke c++ Konsolen Anwendung sollte vollkommen reichen und es dann noch mal in Unreal zu versuchen.

    Was mir sonst noch auffällt ist das das deine Variable CSByteTestFN den gleichen Namen hat wie deine deine Funktion, ich würde das Sicherheitshalber mal umbenennen, könnte sonst eventuell sein das CSByteTest sich selbst aufruft.


    Mein Vorschlag std:string statt char zu nutzen kommt halt daher, weil die c# Funktion eine Zeichenkette zurück gibt und char eigentlich nur Zeichen darstellen kann und keine Zeichenketten.

  • Also std::string funktioniert nicht zwischen interop Grenzen, da ein C# System.String und ein C++ std::string einen anderen Aufbau haben. Daher ist char* schon der richtige interop freundliche typ. Kenne mich leider nicht zu gut in dem Gebiet aus, also kann ich nicht mehr beitragen.

    Ich würde mal einfach vorschlagen auf auf stackoverflow zu suchen.

  • Es ist ja schon verdammt lange her das ich mich mit C aktiv beschäftigt habe. Von daher ist meine Vermutung vielleicht mit etwas Vorsicht zu genießen, einmal weil es natürlich lange her ist, und zum zweiten, weil dieses Problem vielleicht schon lange nicht mehr besteht. Aber ich versuche es trotzdem mal.


    Damals als ich mit C anfing, wurden Strings ebenfalls als Array von Char behandelt. Wenn man diesen dann ausgeben wollte hat man eine Schleife gehabt die dann halt Char für Char aus dem Array ausgegeben hat. Das reichte jedoch nicht, weil diese Ausgabe lediglich vorbereitet wurde. Man musste mit, ich glaube dem Befehl flush oder fflush oder so ähnlich dann noch dafür Sorgen, dass die Ausgabe wirklich stattfindet. Vielleicht ist hier etwas ähnliches notwendig.