Dateipfad in einer Char[] speichern



  • Hallo zusammen.
    Brauche mal Hilfe.
    Habe folgenden Code mal zusammen gebaut in VS C++/CLI:

    private: System::Void buttonOeffnen_Click(System::Object^  sender, System::EventArgs^  e) {
    		if ( OpenFileDialogDateienOeffnen->ShowDialog() == System::Windows::Forms::DialogResult::OK ){
    			strFileNamesAnzahl = 0;
    			for each (String^ file in OpenFileDialogDateienOeffnen->FileNames){
    				strFileNamesAnzahl = strFileNamesAnzahl + 1;
    				MessageBox::Show(file);
    				ProgListe *Nr = new ProgListe;
    
    				//-------------------
    				// Mit diesen Inhalt läuft es nicht mehr:
    				char dataTest[10000];
    				strcpy(dataTest, file);
    				MessageBox::Show(dataTest);
    
    				//--------------------
    
    			}
    			MessageBox::Show("Anzahl der ausgewählten Dateien ist: " + strFileNamesAnzahl);
    		}
        }
    

    Leider bekomme ich es nicht hin den file Inhalt in dataTest zu übertragen.

    Im Internet habe ich schon viel gelesen aber ihrgenswie werfe ich gerade viel durch einander. Deswegen erhoffe ich mir bei euch Klarheit zu bekommen.

    Vielen Dank schon mal für die jenigen die sich bemühen mir meinen Fehler zu erklären. Dabei ist mir schon klar das ich hier String nach Char übergebe.
    Was ich ja auch möchte.

    Gruß



  • Das ist C++/CLI, nicht C++ => falsches Forum

    Keine Ahnung, wie das geht, aber strcpy ist schon in C++ anrüchig, in CLI würde ich es noch viel weniger erwarten.



  • Du hast offensichtlich noch große gurndlegende Verständnisprobleme. strcpy gibt es so wie man es aus C++ kennt in C# nicht (kann es auch nicht - GC und so...).
    Schau dir aber das mal an:
    https://msdn.microsoft.com/de-de/library/2c7h58e5(v=vs.110).aspx



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum C++/CLI mit .NET verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Warum nihct direkt?

    MessageBox::Show(file);
    

    BTW: new ProgListe; erzeugt so wie es dasteht ein Memory-Leak. Zudem ist new nicht .NET (da wäre es gcnew ) und ich würde dir abraten C++ und C++/CLI zu mischen, auch wenn das gerade DER Anwendungsfall ist. C++/CLI ist u. a. genau deshalb ungeeignet um Programmieren zu lernen.



  • Danke erst noch mal für eure Infos.

    Zu lars.tetzlaff@gmx.net und Forum Team:
    Ja sorry habe mich mit der Robrik vertan.
    Danke für das verschieben.

    Zu JulianH
    Ja ich bin dabei mich mit VS C++/CLI zu beschäftigen.
    Habe zwar in anderen Sprachen schon Sachen geschrieben aber noch nicht in C++/CLI.
    Wuste bis dato noch nicht das C++ und C++/CLI unterschiedliche Dinge sind.
    C zu C++ war mich schon klar.
    Aber da man aller Hand an Infos im Internet findet kommt man als Anfänger schon durcheinander.
    Ader langsam lerne ich es ja.
    Bitte von daher um noch etwas Gedullt.

    Werde mir bei nächster Gelegenheit die Seite mal ansehen.

    theta
    Das das geht weiß ich schon, nur ich wollte den Inhalt in ein Array Speichern
    und die MassageBox soll mir dabei nur bestätigen das der file Inhalt in dem Speicher
    angekommen ist.

    Zu:
    ProgListe *Nr = new ProgListe;
    war ein anderen versuch von mir.
    Kann in diesem Fall außer acht gelassen werden.

    Aber Danke für die Info wuste nicht das "new" nicht zu C++/CLI gehört.

    Gruß Cospieler



  • Hallo Cospieler,

    gerade als Anfänger solltest du nicht mit C++/CLI anfangen, und besonders nicht mit einem GUI-Projekt, s.a. Windows Forms und Visual C++ MACHT KEINEN SINN!

    Wenn du C++ lernen willst, dann verwende im VS ein natives C++ Projekt (Win32 Application) und benutze als GUI z.B. Qt, wxWidgets o.ä. [HOWTO] Welches Toolkit für GUIS?

    Wenn du aber generell das .NET_Framework verwenden möchtest, dann nimm C# (der Ein- bzw. Umstieg von C++ ist recht leicht).



  • Danke Th69 für deine Info.

    Habe kurz vor deiner Nachricht den Beitrag "Windows Forms und Visual C++ MACHT KEINEN SINN!" gelesen.

    Am liebsten würde ich ja mit QT arbeiten, aber da das nicht in der Firma wo ich arbeite nicht verwendet wird, sondern nur VS, bin ich gezwungen mich auf den Sachverhalt ein zu lassen.
    Wenn ich Projekte später von einem Kollegen von mir übernehmen möchte.

    Jetzt ist natürlich klar das jetzt von manchen kommt, warum ich nicht meine Kollgen um Programmierrat frage. Ganz einfach die Zeit ist das Problem.
    Da er auch in anderen wichtigen Projekten unterwegs ist.
    Sind da meine Möglichkeiten begrenzt.
    Leider gibt es momentan auch nur ein Kollege der programmiert.

    Und der zweite Grund warum VS, weil unsere externen Programme und Maschinen nur mit VS kompatiebel sind.
    Also auch da bleibt mir keine andere wahl.

    Gruß Cospieler



  • Was genau meinst du mit "nur mit VS kompatibel sind"?
    Auch Qt kann mit dem Visual Studio (VS) programmiert werden (VS ist nur eine IDE).



  • Laut unser IT-Leiter möchte man in unserem Betrieb kein QT installieren, weil nur VS ingesetzt wird. Hänge mit Lizenzen zusammen.

    VS kompatiebilität war gemeint. Das dort Markros geschrieben werden die dann mit unserm externen Programmen genutzt werden können. Andere IDEs würde laut Hersteller nicht angenommen werden.

    Blicke da selber noch nicht durch.
    Ist aussage meiner Kollegen.
    Da ich ja noch am Anfang stehe, kann ich dazu kaum was dazu sagen.

    Mir kommt es so vor das sich keiner mit Qt auseinandersetzen möchte und in ihren trot bleiben möchten. Also bei VS.

    Gruß Cospieler



  • Habt ihr denn bisher nur Konsolenprogramme entwickelt oder welche GUI-Lib verwendet ihr ansonsten bei euch?

    Und deinem IT-Leiter kannst du sagen, daß er keinen Plan hat!



  • Hallo Th69
    Wie ich das momentan sehe sind es nicht nur Konsolenprogramme.
    Da ich erst in die Materie langsam rein komme,
    nehme ich an das es nur die Libs sind die Automatisch bei der VS Version dabei sind. Wir verwenden noch VS 2010.

    Da ich nur eine kleiner fisch bin im großen Aquarium kann ich beim IT-Leiter nicht sowas bringen.

    Können wir bitte jetzt zu meiner Frage zurück kommen.
    Denn ich möchte ja auch was lernen hier.

    Gruß Cospieler



  • #include <cstring>
    
    #include <msclr\marshal.h>
    
    using namespace System;
    using namespace System::Runtime::InteropServices;
    using namespace msclr::interop;
    
    int main(array<System::String ^> ^args)
    {
        String^ myString = "Hello World";
    
        {
            // Reine .NET (CLR) Variante mit ToCharArray()
            array<wchar_t>^ myCharArray = myString->ToCharArray();
        }
    
        {   // Reine .NET (CLR) Variante mit CopyTo(..)
            array<wchar_t>^ myCharArray = gcnew array<wchar_t>(256);
            myString->CopyTo(0, myCharArray, 0, myString->Length);
        }
    
        {   // .NET String nach ISO C++ const char* bzw. char Array mit Marshal::StringToHGlobalAnsi(..)
            System::IntPtr ptr = Marshal::StringToHGlobalAnsi(myString);
            const char* ptr2 = static_cast<const char*>(ptr.ToPointer());
            char myCharArray[256] = {};
            std::strcpy(myCharArray, ptr2);
            Marshal::FreeHGlobal(ptr);
        }
    
        {   // .NET String nach ISO C++ const char* bzw. char Array mit marshal_as<..>
            marshal_context context;
            const char* ptr = context.marshal_as<const char*>(myString);
            char myCharArray[256] = {};
            std::strcpy(myCharArray, ptr);
        }
    
        return 0;
    }
    


  • Vielen dank theta,
    deine Auflistung war das was ich gesucht habe.

    Gruß Cospieler


Log in to reply