Typumwandlung System::String^ in char*



  • Ich glaube ich bin zu blöd zum suchen.
    Kannste mir mal erklären was du machst um das zu finden?



  • underwaterworld schrieb:

    Ich glaube ich bin zu blöd zum suchen.

    Scheint so. (Sorry :D)

    1. Klick auf "C++/CLI mit .NET" (also in dieses Subforum)
    2. Ganz oben: Klick auf "C++/CLI FAQ Archiv"
    3. Oh, dieses Forum hat erst sehr wenig Einträge. Zwei davon enthalten im Titel "char".

    Einer davon:
    http://c-plusplus.net/forum/viewtopic-var-t-is-158664.html



  • Ahh, ich hab die suche genutzt und dort halt nichts gefunden.

    Aber eine Frage hab ich noch.
    Wenn ich eine DLL habe und dort der Rückgabewert ein char* ist, der aber von ein string^ kommt. Dann kann ich den string^ nicht freigeben, denn sonst würde der char* nicht mehr funktionieren. Was mach ich jetzt?



  • Also so hier:

    extern "C" __declspec(dllexport) char* char_zeiger()
    {
        System::String^ str = "Hello world\n";
        char* str2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);
        return str2;
    }
    

    Wenn ich diese Funktion immer und immer wieder aufrufe, dann wird der Speicher größer und größer. Was jetzt?



  • ja natürlich... Du gibst ja auch nie Speicher frei, geschweige denn hast Du den Beitrag in der FAQ gelesen...



  • Ja, Beitrag gelesen.
    Genau das ist das je was ich meinte:
    Wenn ich eine DLL habe und dort der Rückgabewert ein char* ist, der aber von ein string^ kommt. Dann kann ich den string^ nicht freigeben, denn sonst würde der char* nicht mehr funktionieren. Was mach ich jetzt?



  • Ich muss zum Zahnarzt 😞
    Werde heute aber bestimmt noch reinschauen, glaub ich



  • Wenn Du ein "char*" zurückgeben willst, dann hast Du ein Design-Problem...

    Oder:
    Du verwendest die *selbe* DLL-Version der CRT und vereinbarst eine Allokations-Mechanismus/freigabe

    Oder:
    Du stellst eine FreeMyString-Funktion in der DLL zur Verfügung.



  • Oh man ich hasse Zahnärzte, einer ist schlechter als der andere. Die schauen viel zu schnell bei einer Kontrolle und wenn man sagt: Was ist mit diesem Zahn ... Dann sagen die: Oh ja stimmt ... Aber meistens ist es zu spät und dann muss gebohrt werden.

    Zu den Vorschlägen:
    Der letzte Vorschlag sieht vielversprechend aus, müsste funktionieren.

    Der zweite Vorschlag ist für mich noch nicht ganz klar. Bedeutet das ich die DLL und die EXE mit dem selben CLR erstellen muss? Und wie vereinbare ich diesen Allokations-Mechanismus/freigabe?



  • underwaterworld schrieb:

    Der letzte Vorschlag sieht vielversprechend aus, müsste funktionieren.

    Ist neben der gänzlichen Vermeidung von solchen Situationen, der sinnvollste.

    underwaterworld schrieb:

    Der zweite Vorschlag ist für mich noch nicht ganz klar. Bedeutet das ich die DLL und die EXE mit dem selben CLR erstellen muss?

    Nicht CLR, sondern CRT!
    Das bedingt:
    - Selber Compiler (incl. SP-Level)
    - Selbe Compiler-Settings (insbesondere /GS und /MD(d)

    Also eigentlich nur machbar, wenn Du sowohl EXE als auch DLL selbst erstellst und die DLL *nie* von jemand anders verwendet wird!

    underwaterworld schrieb:

    Und wie vereinbare ich diesen Allokations-Mechanismus/freigabe?

    Per Doku?



  • Ist neben der gänzlichen Vermeidung von solchen Situationen, der sinnvollste.

    Das glaub ich auch 😃

    Ok, ich Schau mir das mit der zweiten Geschichte mal morgen genauer an, hab ja morgen frei 🙂 und es schadet ja nicht das dennoch als alternative zu kennen 😉


Anmelden zum Antworten