String in const char* umwandeln....



  • 1. Bist Du Dir bewusst dass System::String^ nicht C++ sondern C++/CLI (.NET) ist?
    2. Wenn ja, bist Du Dir bewusst dass System::String^ ein managed Typ ist?
    3. Wenn ja, bist Du Dir sicher dass Du Managed und Unmanaged Code mischen möchtest?



  • Ne, war mir leider nicht bewusst... Sorry 😞

    Also hab mir einfach mit VC++Express nen Fenster zusammengeklickt und wollte jetzt einfach den File-Namen den ich aus dem Dialog bekomme in einer Datei speichern... von .Net-Zusammenhängen usw. die plötzlich auftreten wusste ich nichts 😞





  • danke für den link...
    aber irgendwie finde da nicht das passende für mich 😞
    ich will ja einfach nur einen String^ in einen const char* umwandeln ...
    MFC müsste ich doch eigentlich auch nutzen (theoretisch) oder? jedenfalls erkennt er CString auch nach erfolgreichem einbinden nicht 😞



  • 206RC++ schrieb:

    aber irgendwie finde da nicht das passende für mich 😞

    Dann hast du den Link von Jochen nicht gelesen. Da steht genau das was du suchst. Das einzige was du noch machen musst, wäre std::string::c_str () aufrufen und schon hast du deinen const char*. Warum muss es den unbedingt const char* sein?



  • Unter dem angegebenen Link steht in einem Beitrag auch dass hier:

    Jochen Kalmbach schrieb:

    #include <windows.h>
    #include <tchar.h>
    using namespace System;
    struct StringConvA
    {
      char *szAnsi;
      StringConvA(System::String ^s)
        : szAnsi(static_cast<char*>(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(s).ToPointer()))
      {}
      ~StringConvA()
      {
        System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szAnsi));
      }
      operator LPCSTR() const
      {
        return szAnsi;
      }
    };
    
    struct StringConvW
    {
      wchar_t *szUnicode;
      StringConvW(System::String^ s)
        : szUnicode(static_cast<wchar_t*>(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(s).ToPointer()))
      {}
      ~StringConvW()
      {
        System::Runtime::InteropServices::Marshal::FreeHGlobal(IntPtr(szUnicode));
      }
      operator LPCWSTR() const
      {
        return szUnicode;
      }
    };
    
    #ifdef _UNICODE
    #define StringConvT StringConvW
    #else
    #define StringConvT StringConvA
    #endif
    

    Die Verwendung ist dann z.b: wie folgt:

    int _tmain()
    {
      String ^s = "abc";
      printf("%s", (LPCTSTR) StringConvA(s));
      wprintf(L"%s", (LPCTSTR) StringConvW(s));
      _tprintf(_T("%s"), (LPCTSTR) StringConvT(s));
    }
    

    Oder für std::string/wstring:

    #include <string>
    int _tmain()
    {
      String ^s = "abc";
      std::string ansi = StringConvA(s);
      std::wstring unicode = StringConvW(s);
    }
    

    Und das ist genau das was du wolltest.

    BR
    Vinzenz



  • PuppetMaster2k schrieb:

    Dann hast du den Link von Jochen nicht gelesen. Da steht genau das was du suchst. Das einzige was du noch machen musst, wäre std::string::c_str () aufrufen und schon hast du deinen const char*.

    Naja, nicht ganz... das geht zwar auch aber ein std::string ist gar nicht nötig:

    void Test(const char *pszStr);
    
    void ManagedFunc(String ^str)
    {
      Test(StringConvA(str));
    }
    

    tut's auch...



  • Ich hab nochmals ein besseres Beispiel in der FAQ gemacht:

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



  • juhu, es klappt.... die structs etc. mit eingebaut und dann lief es....
    super, vielen Dank! 🙂

    achja....wollte noch fragen ob es möglich ist beliebige exe dateien aufzurufen.....

    Mfg



  • 206RC++ schrieb:

    achja....wollte noch fragen ob es möglich ist beliebige exe dateien aufzurufen.....

    System::Diagnostics::Process::Start


Anmelden zum Antworten