Strings und Forms mit C++ und dem .NET Framework



  • Hallo erstmal,

    das ist mein erster Beitrag hier im Forum.
    Ich programmiere schon seit einigen Jahren mit C++ und Java, würde mich also nicht mehr als Anfänger bezeichnen.
    Das ist nun das erstemal, dass ich mich dem .NET-Framework und Visual Studio beschäftige.
    Ich versuche Normalerweise immer plattform unabhängig zu programmieren, dazu nehme ich C++ und Qt oder Java mit Swing.

    Für eine Semesterarbeit haben sich meine Gruppe und ich darauf geeinigt das Projekt mit VB.NET durchzuführen, ich möchte aber meinen Teil in C++ machen, ein anderer Kommolitone möchte seinen Teil in C# erledigen.
    Das mal nur soweit als Information am rande.

    Als kleine Übung, um den Umgang mit dem .NET-Framework zu lernen habe ich mir gedacht ich schreibe ein kleines Tool, mit dem ich Adressen in eine Datenbank speichere.

    So als erstes habe ich mir dann eine kleine Oberfläche zusammengeklickt und eine Klasse Adressen geschrieben:
    Klasse:
    Adressen.h

    #include "stdafx.h"
    #ifndef _ADRESSEN_
    #define _ADRESSEN_
    #include <string>
    
    using namespace std;
    using namespace System;
    
    class Adressen
    {
    private:
    	//Struktur eines Adressbucheintrages
    	struct adressen{
    	string a_Vorname;
    	string a_Nachname;
    	string a_Straße;
    	string a_Hausnummer;
    	int a_PLZ;
    	string a_Ort;
    	string a_E_Mail;
    	};
    	//Datentyp meine Adressen
    	adressen MeineAdressen;
    
    public:
    	Adressen(void);
    	//Konstruktor zum füllen der Lokalen Variablen
    	Adressen(string p_vorname, string p_nachname, string p_straße, 
    		string p_hausnummer, int p_plz, string p_ort, string p_email);
    
    	//DataGrid
    	void InsertControl();
    };
    #endif
    

    Adressen.cpp

    #include "StdAfx.h"
    #include "Adressen.h"
    #include <string>
    
    using namespace std;
    using namespace System;
    
    Adressen::Adressen(void)
    {
    }
    
    Adressen::Adressen(string p_vorname, string p_nachname, string p_straße, 
    				   string p_hausnummer, int p_plz, string p_ort, string p_email)
    {
    //Zuweisen der Übergabeparamter zu der lokalen Struktur "adressen" (Adressen.h)
    MeineAdressen.a_Vorname = p_vorname;
    MeineAdressen.a_Nachname = p_nachname;
    MeineAdressen.a_Straße = p_straße;
    MeineAdressen.a_Hausnummer = p_hausnummer;
    MeineAdressen.a_PLZ = p_plz;
    MeineAdressen.a_Ort = p_ort;
    MeineAdressen.a_E_Mail = p_email;
    
    }
    
    void Adressen::InsertControl()
    {
    
    }
    

    Auf der Oberfläche gibt es ein TextFeld, dass sich txtVorname nennt.
    Bei einem Klick auf einen Button soll der Inhalt des Feldes zuersteinmal in eine Lokale Variable gespeichert werden:

    string Vorname = txtVorname->Text->ToString();
    

    Wenn ich den Code so versuche zu kompilieren dann erhalte ich folgende Fehlermeldung:

    Fehler 1 error C2440: 'Initialisierung': 'System::String ^' kann nicht in 'std::basic_string<_Elem,_Traits,_Ax>' konvertiert werden

    wenn ich den code aber folgendermaßen abändere:

    String^ Vorname = txtVorname->Text->ToString();
    

    dann fuktioniert das ganze.
    Was bedeutet dieses

    ^
    

    ?

    wenn ich versuche die Datentypen in der Klasse auf

    String^
    

    abzuändern, dann erhalte ich folgende Fehlermeldung:

    Fehler 1 error C3265: Ein verwalteter 'a_Vorname' kann nicht in einem nicht verwalteten 'Adressen::adressen' deklariert werden

    Was ist ein Verwalteter Datentyp?

    Was mir auch noch nicht ganz klar ist ist der Aufruf von Funktionen über diesen Pfeil:

    ->
    

    Ich kenne es so, dass Methoden so aufgerufen werden (zumindest bei selbst erstellten klassen):

    ObjektMeinerKlasse.MeineMethode1(Parameter Eins, Parameter * zwei)
    

    Beispiel aus meinem Programm:

    txtVorname->Text->ToString();
    

    Desweiteren würde ich gerne wissen wie man mit DLL's umgeht und sie später in einem anderen Programm instanziert.
    Ich habe zwar schon einiges bei google gefunden aber nichts davon hat mir so recht geholfen.
    Wie übergebe ich Parameter an eine DLL und wie ist der grundlegende aufbau (main(), klassen, etc.)?

    Vielen dank für eure hilfe und schönes wochenende.

    lg,
    fabi++



  • Hallo,

    So viele Fragen auf einmal 🙂 Erstmal ist wichtig zu wissen das C++ (das was du geschrieben hast) und C++/CLI (C++ mit .Net Erweiterungen - das was du hättest schreiben müssen) zwei unterschiedliche Sprachen sind. C++/CLI erweitert zwar C++ in gewisser Weise, aber beide mischen zu wollen ist keine gute Idee wenn man nicht weiß was man macht. Hier gibts z.B. auf Wikipedia ne kleine Übersicht worum es sich bei C++/CLI handelt. Da steht auch was managed Code ist, was die Operatoren ^ und % bedeuten.

    Denke mit dem Wissen das du dich nach C++/CLI erkundigen musst, findest du einige Informationen zum weiterlernen.

    Was mir auch noch nicht ganz klar ist ist der Aufruf von Funktionen über diesen Pfeil:

    ->
    

    Äh, wenn du nicht weißt was das für ein Operator ist, dann frag ich mich wie du vorher C++ programmiert hast? Der ist echt nichts neues und gehört zu den Grundlagen.

    Was die Dlls angeht kommt es drauf an ob ihr die referenziert oder dynamisch laden wollt. Beim Referenzieren (einfach im VS Projekt als Referenz hinzufügen) müsst ihr nur den passenden Namespace einbinden und könnt dann die Typen wie jede andere Klasse verwenden.

    Nochwas zum Schluss: Wenn du meinst du kannst Java, dann würd ich dir unbedingt empfehlen wie dein Komilitone, auch C# zu machen. Bei C++/CLI musst du ne umständliche Syntax + die .Net Klassenbibliothek kennenlernen, bei C# sind die Syntaxunterschiede zu Java relativ gering, da kannst du dich besser auf das eigentliche Problem - richtige Benutzung der Klassenbibliothek - konzentrieren.



  • Ich habe einfach mal ein paar meiner letzen Antworten zu dem Zusammenhang gepostet.

    Das Fazit ist klar:
    1. C++/CLI ist da um die managed und die unmanaed Welt zu verbinden und das ist selten nötig.
    2. C++/CLI ist komplizierter als andere Sprachen und bietet exterm viele Fallstricke. Meistens handelt man sich mehr Probleme ein, als man löst.
    3. C++/CLI unterstützt kein WPF.
    4. C++/CLI und C++ (ISO / ANSI) ist nicht gleich, nur Ähnlich. Das machts aber nur schwieriger. Z.B. gibts in C++/CLI kein Keyword class, sondern nur ref class oder value class... Du hast es vermutlich nicht bemerkt.
    5. Um die managed und unmanaged Code zu Verbinden, muss man in beiden Welten, ich sag mal "Experte" sein. Ansonsten merkt man nicht mal das man haufenweise Probleme hat.

    Meine Empfehlung:
    Nimm C# oder VB.NET (hast Du ja schon) um den Umgang mit .NET zu lernen.

    theta schrieb:

    Zudem finde ich es erwähnenswert, dass C++/CLI nicht die richtige Sprache für die Anwendungsentwicklung ist. C++/CLI eignet sich um die managed und unmanaged Welt zu verbinden und so einen Integrationslayer zu bilden.

    Für die Anwendungsentwicklung im managed Bereich würde ich C# od. VB.NET empfehlen.

    Simon

    theta schrieb:

    Bleib in einer Welt. Wenn managed, mache alles managed, wenn native, mache alles native. Der Traum, das GUI in .NET und der Rest z.B. in native C++ zu machen ist meiner Meinung nach nicht sehr schlau und zudem recht steinig.

    Simon

    theta schrieb:

    Deine Probleme könntest Du auch umgehen, indem Du in einer Welt bleibst (z.B. der managed) und die dafür gedachten Mechanismen benutzt.

    Benutze doch die Klasse SendKeys, anstatt keybd_event(..)
    http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx

    Ausserdem ist die P/Invoke Deklaration in C++/CLI nicht nötig. Es hätte gereicht, dem Linker die User32.lib bekanntzumachen.

    Aber wie gesagt, Entscheide dich ob managed oder nicht und suche entsprechende Lösungen. Es ist in dem meisten Fällen nicht nötig managed und unmanaged zu mischen.

    Simon

    theta schrieb:

    Warum mischst Du ISO C++ mit C++/CLI.
    Das würde ich nicht tun, Du handelst Dir nur Probleme ein, die Du nicht einfach lösen kannst. Ausserdem , wo ist der Sinn?

    Simon

    theta schrieb:

    Hör auf managed mit unmanaged Code zu mischen.
    Das macht alles sehr (und vorallem unnötig) kompliziert.

    Simon

    Simon



  • ersteinmal vielen dank für die antworten.

    @Zwergli:

    Äh, wenn du nicht weißt was das für ein Operator ist, dann frag ich mich wie du vorher C++ programmiert hast? Der ist echt nichts neues und gehört zu den Grundlagen.

    ich kenne diesen operator, um zeiger auf sturkturen zu übergeben. aber das hätte ich vielleicht vorhin schreiben sollen.

    Wenn du meinst du kannst Java

    das finde ich jetzt nicht so nett 😡 ! ich hätte aber auch erwähnen sollen, das ich mit c++ schon ca. 3 jahre nichts mehr gemacht habe, und es auf dem tg gelernt habe. damals habe ich ansi c++ gelernt. deshalb sagte ich ja, das das meine erstem geh versuche mit visual c++ sind. und nach dem jetztigen stand auch die letzten.
    ich würde ja java liebend gerne für die arbeit nehmen, nur leider haben sich meine kommolitonen dagegen gewehrt und .NET als das maß aller dinge angewiesen. diesem willen musste ich mich dann beugen.

    trotzdem vielen dank für deine hilfe.

    @theta:

    Das Fazit ist klar:
    1. C++/CLI ist da um die managed und die unmanaed Welt zu verbinden und das ist selten nötig.
    2. C++/CLI ist komplizierter als andere Sprachen und bietet exterm viele Fallstricke. Meistens handelt man sich mehr Probleme ein, als man löst.
    3. C++/CLI unterstützt kein WPF.
    4. C++/CLI und C++ (ISO / ANSI) ist nicht gleich, nur Ähnlich. Das machts aber nur schwieriger. Z.B. gibts in C++/CLI kein Keyword class, sondern nur ref class oder value class... Du hast es vermutlich nicht bemerkt.
    5. Um die managed und unmanaged Code zu Verbinden, muss man in beiden Welten, ich sag mal "Experte" sein. Ansonsten merkt man nicht mal das man haufenweise Probleme hat.
    

    vielen dank für das fazit, jetzt ist mir vieles klarer! das wusste ich vorher nicht. ich dachte immer das was microsoft da in seinem visual studio verwendet sei ansi c++. ich verstehe auch nicht ganz warum das dann von ms so abgwewandelt wurde. das macht es nur schwerer das ganze zu verstehen, also meiner meinung nach.
    ich habe jetzt auch keine lust das microsoft interne gedöns zu lernen, das mir auf meiner eigentlich hauptplattform (os x) eh nichts bringt (ok, es gibt mono, aber das ist in meinen augen auch keine wirklich runde sache!).

    ich werde mir wohl dann VB.NET aneignen, zumal das auch teil einer vorlesung dieses semster ist.
    dann habe ich einen doppelten lerneffekt, einmal für das projekt und einmal für die klausur 😃 .

    ich möchte aber nicht, dass das thema c++ für mich gestorben ist. gibts es auch frameworks und ide's die mit ansi/iso c++ arbeiten und keine solche "abarten" der sprache enthalten?
    ich habe mir Qt4 (evtl. auch GTK) am freitag kurz angeschaut aber noch nichts damit gemacht.
    es sollte unbedingt plattform unabhänog sein und ich möchte auch gerne guis damit bauen (so wie mit swing unter java). würde das ganze gerne unter os x, windows und linux verwenden.
    kennt da jemand was, und kann eine empfehlung ausgeben.

    nochmal vielen dank für die tolle hilfe.

    lg,
    fabi++



  • ich verstehe auch nicht ganz warum das dann von ms so abgwewandelt wurde.

    Ganz so ist es nicht. ISO/ANSI C++ bleibt immernoch und der MS Compiler dafür ist heutezutage sehr konform und gut (das war nicht immer so). C++/CLI ist eine neue Sprache, die eine sehr gute Interoperabilität zu ISO C++ bietet.
    Edit
    C++/CLI ist eine erweiterung zu ISO C++, die nur in speziellen Fällen genutzt werden sollte.

    Du kannst ruhig ISO C++ mit dem Visual Studio programmieren, wenn Du möchtest. Welchen GUI Toolkit (falls überhaupt) Du verwendest ist wieder eine andere Frage. Ob MFC, wxWidgets, Qt oder was auch immer.

    Es sollte, wie gesagt, einfach bewusst sein, dass C++ und C++/CLI zwei verschiedene Sprachen sind.

    Simon



  • Es sollte, wie gesagt, einfach bewusst sein, dass C++ und C++/CLI zwei verschiedene Sprachen sind.

    ok, das ist jetzt klar, aber kann ich guis mit dem visiual studio überhaupt ohne c++/cli schreiben?

    weil ich für manche sachen, die ich mir so zusammenbastel einfach ein gui benötige.
    wäre da dann das gtk toolkit oder qt nicht besser?
    können die dann mit iso/ansi c++ richtig umgehen. sonst wäre c++ für mich zum programmieren ziemlich ungeeignet. sonst müsste ich klassen, etc. ja für jedes toolkit/framework wieder anpassen.

    lg,
    fabi++



  • Fabi++ schrieb:

    Es sollte, wie gesagt, einfach bewusst sein, dass C++ und C++/CLI zwei verschiedene Sprachen sind.

    ok, das ist jetzt klar, aber kann ich guis mit dem visiual studio überhaupt ohne c++/cli schreiben?

    Ja. Aber nicht mit dem GUI Toolkit WinForms, sondern z.B. MFC, wxWidgets, Qt, GTK etc.

    Fabi++ schrieb:

    wäre da dann das gtk toolkit oder qt nicht besser?

    Das kommt drauf an. Ob Du z.B. mehrere Platformen unterstützen möchtest, dann wäre MFC nicht geeignet, dafür aber Qt.

    Fabi++ schrieb:

    können die dann mit iso/ansi c++ richtig umgehen. sonst wäre c++ für mich zum programmieren ziemlich ungeeignet.

    Wenn Du eines nimmst, welches für C/C++ geht, dann ist das ok. Qt, wxWidgets, GTK sind sicher geeignet für C++ und sogar noch auf mehreren Platformen verfügbar.

    Simon


Anmelden zum Antworten