Frage zu Mircosoft Visual C++ 2010 Express Edition



  • WAS geht denn bei
    http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/
    nicht?`

    WAS hast Du für ein Problem?
    WELCHE Fehlermeldung kommt?



  • Die Klasse "System", die ich verwende wird rot unterstrichen(Wellenlinie). Wenn ich debugge, kommen Fehlermeldungen, dass die Klasse System nicht bekannt ist. Habe es genauso, wie im Vidoe gemacht.



  • 1. Ich tippe darauf, dass Du den Namespace System meinst und nicht eine Klasse
    2. Dieser Namespace kommt von .NET

    Daraus ergeben sich zwei Dinge:
    a.) http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/
    b.) CRT statisch linken und .NET Support geht nicht zusammen.



  • gibt es eine andere Möglichkeit?



  • Ich nehme an du hast die Referenz gelöscht? Im Solutions Explorer rechts Klick auf Referenz -> "Referenz hinzufügen" -> ".NET" Tab -> System suchen und Ok.

    Btw wenn's ein DotNet Anwendung ist, dann nimmt man an es ist vorhanden und weist es als Voraussetzung aus.



  • Aktiv nicht, aber könnte schon passiert sein. Probiere es morgen aus.



  • Btw wenn's ein DotNet Anwendung ist, dann nimmt man an es ist vorhanden und weist es als Voraussetzung aus.

    Oder schreibt einen Installer...



  • Deaktiviere die "/clr" Option in Deinem Projekt (Project|Properties|General|Common Language Runtime Support: No) ... beachte auch bitte:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/



  • Die erinnerung schrieb:

    Die Klasse "System", die ich verwende wird rot unterstrichen(Wellenlinie). Wenn ich debugge, kommen Fehlermeldungen, dass die Klasse System nicht bekannt ist. Habe es genauso, wie im Vidoe gemacht.

    Ach so ist mir gerade aufgefallen, da du offensichtlich ein CLR Projekt hast kannst du natürlich nicht wie im Video CLR abschalten.

    Jochen Kalmbach hat mit seinen Blog natürlich recht.



  • Und das alles stand schon früher hier... 🕶



  • theta schrieb:

    Und das alles stand schon früher hier... 🕶

    in der Tat 🤡



  • Also, Jungs,
    geht das jetzt irgendwie?

    Und das mit der Referenz finde ich nicht!



  • WAS hast Du für ein Problem?



  • Also,

    1. Mein Problem:

    • Alle Methoden, die ihr geschrieben habt, um mein Programm auf fremden Rechnern laufen zu lassen sind gescheitert.
    • Ich brauche eine Methode, die mir das ermöglicht.

    So damit wäre das geklärt.

    Und
    2. Will ich euch mal sagen, was ich überhaupt vorhabe:

    • Ich will ein erinnerungsprogramm schreiben (Erinnert an Termine). Das ist schon fertig.
    • ich will ein Konfigurationsprogramm schreiben. Dieses verwaltet das Andere, die Termine und noch 1, 2 andere Dinge.
    • Dann soll noch ein Setup-Programm kommen. Das installiert die beiden Anderen von einer CD. D.h. ich könnte die nötigen Datein auch auf die CD schreiben und rüberziehen. ich weiß aber nicht welche dteien ich benötige.

    So das war's erstmal grob. Wenn jemand Fragen oder eine lösung für mich hat, bitte antworten!

    Danke schonmal im Voraus!

    Mfg Die erinnerung

    P.S.: Jetzt wisst ihr auch, warum ich so heiße!



  • Lösung zu Deinem Problem:
    - VS starten
    - File|New|Project...
    - Visual C++|Win32|Win32 Project
    - Namen vergeben
    - Ok
    - Next
    - Finsih
    - In den Projekteinstellungen umstelllen auf statisch linken (siehe mein Webcast)
    - Jetzt ganz viel Programmieren damit Du die GUI hinbekommst... und optional einen externen RC-Editor verwenden....

    Alternativ:
    Du verwendest nicht die Express-Version sondern die Prof. Version. Diese gibt es auch als 180 Tage Testversion.

    Damit kannst Du eine MFC-Application (Dialog based) erzeugen, die es wesentlich vereinfacht...

    Alternative 2:
    Du verwendest QT.



  • Alternative 3:

    Er portiert sein C++/CLI auf C#.



  • Na, das läuft aber nicht auf anderen Rechnern, ohne dass man was installiert...



  • Jochen Kalmbach schrieb:

    - In den Projekteinstellungen umstelllen auf statisch linken (siehe mein Webcast)

    Hab ich schon probiert! Geht nicht. wie ja schon2 mal gesagt, ich ver wende ganz viel

    using namespace System;
    

    kommen ganz viele Fehlermeldungen zu Thema System nicht vorhanden!



  • Jochen Kalmbach schrieb:

    Na, das läuft aber nicht auf anderen Rechnern, ohne dass man was installiert...

    Wäre kein Problem! Brauch ja eh eine Installer!



  • Ich poste mal kurz meine Quelltext.

    Hauptdatei:

    // Errinerer.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    #include "Form1.h"
    #include <fstream>
    #include <ctime>
    #include <windows.h>
    
    using namespace Errinerer;
    using namespace System;
    using namespace System::IO;
    using namespace System::Collections::Generic;
    
    String^ Wochentag(DateTime Zeit)
    {
        String^ Alles = Zeit.ToString("D");
        return Alles->Substring(0, Alles->IndexOf(","));
    }
    
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
        // Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden
        Application::EnableVisualStyles();
        Application::SetCompatibleTextRenderingDefault(false); 
    
        try
        {
            StreamReader^ Datei, ^Befehlsdatei;
            StreamWriter^ Zustand;
            array<String^> ^Daten = gcnew array<String^>(3);
            List<String^> ^Zeiten;
            List<String^> ^Texte;
            List<String^> ^Deaktiviert = gcnew List<String^>();
            List<String^> ^Deaktiviert2 = gcnew List<String^>();
            DateTime Zeit;
            String^ Ram;
            int j;
    
            Datei = gcnew StreamReader("Liste.txt");
    
            Zustand = gcnew StreamWriter("Zustand.txt");
            Zustand->Write("Läuft...");
            Zustand->Close();
    
            while(true)
            {
                Zeiten = gcnew List<String^>();
                Texte = gcnew List<String^>();
    
                Zeit = DateTime::Now;
    
                if (Datei->Peek() == -1)
                {
                    Datei->Close();
                    Datei = gcnew StreamReader("Liste.txt");
                    continue;
                }
                Daten[0] = Datei->ReadLine();
                Daten[1] = Datei->ReadLine();
                Daten[2] = Datei->ReadLine();
    
                Zeiten->Add(Daten[1]);
                Texte->Add("Jetzt hast du " + Daten[0] + ".");
    
                Datei->ReadLine();
    
                Ram = Datei->ReadLine();
    
                j = 1;
    
                while(Ram[0] != '-')
                {
                    Zeiten->Add(Ram->Split('|')[0]);
                    Texte->Add(Ram->Split('|')[1]->Replace("&<-", "\n"));
                    Ram = Datei->ReadLine();
                    j++;
                }
    
                Form1^ fenster = gcnew Form1();
    
                for (int i = 0; i < j; i++)
                {
                    if (((DateTime::Now.ToString("t") == Zeiten[i]) && (Wochentag(Zeit) == Daten[2])) &&
                        ((Deaktiviert->IndexOf(Daten[0]) == -1) &&
                        (Deaktiviert2->IndexOf(Daten[0] + "|" + Zeiten[i]) == -1)))
                    {
                        fenster->label1->Text = Daten[0];
                        fenster->label2->Text = "Du hast " + Daten[0] + "!\n" + Daten[2] + "s um " + Daten[1]
                            + " Uhr.\n\n" + Texte[i];
    
                        Application::Run(fenster);
    
                        Deaktiviert2->Add(Daten[0] + "|" + Zeiten[i]);
    
                        if(!(fenster->checkBox1->Checked))
                        {
                            Deaktiviert->Add(Daten[0]);
                        }
                    }
                }
                if(DateTime::Now.ToString("t") == "00:00")
                {
                    Deaktiviert = gcnew List<String^>();
                    Deaktiviert2 = gcnew List<String^>();
                }
                Befehlsdatei = gcnew StreamReader("Pause.txt");
    
                if (Befehlsdatei->Peek() == 69)
                {
                    Zustand = gcnew StreamWriter("Zustand.txt");
                    Zustand->Write("Ende");
                    Zustand->Close();
    
                    return 0;
                }
    
                if (Befehlsdatei->Peek() == 83)
                {
                    Datei->Close();
    
                    while (Befehlsdatei->Peek() == 83)
                    {
                        Befehlsdatei->Close();
    
                        Sleep(5000);
    
                        Befehlsdatei = gcnew StreamReader("Pause.txt");
                    }
    
                    Datei = gcnew StreamReader("Liste.txt");
                }
                Befehlsdatei->Close();
    
                Sleep(950);
            }
        }
        catch(ArgumentOutOfRangeException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(ArgumentNullException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(ArgumentException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(InvalidOperationException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(NullReferenceException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(IndexOutOfRangeException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(FormatException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(SystemException ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        catch(Exception ^e)
        {
            MessageBox::Show("Es ist ein Fehler aufgetreten!\n\n" + e->ToString(), "Fehler");
        }
        return 0;
    }
    

    Nicht wundern, die catch-Blöcke dienen nur zur Sicherheit!

    Das Form:

    #pragma once
    
    namespace Errinerer {
    
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    
    	/// <summary>
    	/// Zusammenfassung für Form1
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO: Konstruktorcode hier hinzufügen.
    			//
    		}
    
    	protected:
    		/// <summary>
    		/// Verwendete Ressourcen bereinigen.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
    	public: System::Windows::Forms::Label^  label1;
    	protected: 
    	private: System::Windows::Forms::Button^  button1;
    	public: System::Windows::Forms::CheckBox^  checkBox1;
    	public: System::Windows::Forms::Label^  label2;
    
    	private:
    		/// <summary>
    		/// Erforderliche Designervariable.
    		/// </summary>
    		System::ComponentModel::Container ^components;
    
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Erforderliche Methode für die Designerunterstützung.
    		/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			System::ComponentModel::ComponentResourceManager^  resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid));
    			this->label1 = (gcnew System::Windows::Forms::Label());
    			this->button1 = (gcnew System::Windows::Forms::Button());
    			this->checkBox1 = (gcnew System::Windows::Forms::CheckBox());
    			this->label2 = (gcnew System::Windows::Forms::Label());
    			this->SuspendLayout();
    			// 
    			// label1
    			// 
    			resources->ApplyResources(this->label1, L"label1");
    			this->label1->Name = L"label1";
    			// 
    			// button1
    			// 
    			resources->ApplyResources(this->button1, L"button1");
    			this->button1->Name = L"button1";
    			this->button1->UseVisualStyleBackColor = true;
    			this->button1->Click += gcnew EventHandler(this,&Form1::Beenden);
    			// 
    			// checkBox1
    			// 
    			resources->ApplyResources(this->checkBox1, L"checkBox1");
    			this->checkBox1->Checked = true;
    			this->checkBox1->CheckState = System::Windows::Forms::CheckState::Checked;
    			this->checkBox1->Name = L"checkBox1";
    			this->checkBox1->UseVisualStyleBackColor = true;
    			// 
    			// label2
    			// 
    			resources->ApplyResources(this->label2, L"label2");
    			this->label2->Name = L"label2";
    			// 
    			// Form1
    			// 
    			resources->ApplyResources(this, L"$this");
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->Controls->Add(this->label2);
    			this->Controls->Add(this->checkBox1);
    			this->Controls->Add(this->button1);
    			this->Controls->Add(this->label1);
    			this->MaximizeBox = false;
    			this->MinimizeBox = false;
    			this->Name = L"Form1";
    			this->ResumeLayout(false);
    			this->PerformLayout();
    
    		}
    		void Beenden(System::Object^ Sender, System::EventArgs^ e)
    		{
    			Close();
    		}
    #pragma endregion
    	};
    }
    

    Und noch ne automatisch erzeuge Datei:

    #include "stdafx.h"
    
    using namespace System;
    using namespace System::Reflection;
    using namespace System::Runtime::CompilerServices;
    using namespace System::Runtime::InteropServices;
    using namespace System::Security::Permissions;
    
    //
    // Allgemeine Informationen über eine Assembly werden über die folgenden
    // Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
    // die mit einer Assembly verknüpft sind.
    //
    [assembly:AssemblyTitleAttribute("Errinerer")];
    [assembly:AssemblyDescriptionAttribute("")];
    [assembly:AssemblyConfigurationAttribute("")];
    [assembly:AssemblyCompanyAttribute("")];
    [assembly:AssemblyProductAttribute("Errinerer")];
    [assembly:AssemblyCopyrightAttribute("Copyright (c)  2010")];
    [assembly:AssemblyTrademarkAttribute("")];
    [assembly:AssemblyCultureAttribute("")];
    
    //
    // Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
    //
    //      Hauptversion
    //      Nebenversion
    //      Buildnummer
    //      Revision
    //
    // Sie können alle Werte angeben oder für die Revisions- und Buildnummer den Standard
    // übernehmen, indem Sie "*" eingeben:
    
    [assembly:AssemblyVersionAttribute("1.0.*")];
    
    [assembly:ComVisible(false)];
    
    [assembly:CLSCompliantAttribute(true)];
    
    [assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)];
    

    Das War's.


Anmelden zum Antworten