Consolenanwendung für Win XP Embedded



  • Hallo,

    ich habe einen Problem meine Anwendung auf XP Embedded zum laufen zu bekommen.

    Ich muss gestehen in C++ bin ich überhaupt nicht fit, komme eher aus der .NET Welt.

    Ich habe also meine Anwendung als Console geschrieben. Mein Entwicklungsrechner läuft mit Win7. Hier klappt es einwandfrei.
    Auf Windows XP Embedded hingegen sehe ich kurz das Konsolenfenster, welches jedoch sofort wieder geschlossen wird. Fehlermeldung gibts keine.

    Und natürlich endet mein Code mit:

    cin.get();
    
    	return 0;
    }
    

    Das Projekt habe ich mit Visual Studio 2010 erstellt. Als Vorlage diente ein leeres C++ Projekt.

    Der komplette Code:

    #include <string>
    #include <iostream>
    #include <Windows.h>
    
    using namespace std;
    
    string ExePath() {
        char buffer[MAX_PATH];
        GetModuleFileName( NULL, buffer, MAX_PATH );
        string::size_type pos = string( buffer ).find_last_of( "\\/" );
        return string( buffer ).substr( 0, pos);
    }
    
    int main()
    {
    	char INIValue[50];
    	GetPrivateProfileString("general", "Type", "Error", INIValue, 256, "e:\\mnc\\mnc_site.ini");
    	cout << "Typ ='" << INIValue << "'" << endl;
    
    	string zipFile;
    
    	if (strcmp(INIValue, "Error") != 0)
    	{
    		if (strcmp(INIValue, "ESPACE") == 0)
    			{
    				zipFile = ExePath() + "\\M38.exe";
    			}
    		else
    			{
    				zipFile = ExePath() + "\\M33_36_37.exe";
    			}
    
    		ShellExecute(GetDesktopWindow(),"open", zipFile.c_str(), "/auto e:\\mnc", NULL, SW_SHOWNORMAL);
    	}
    	else
    	{
    		cout << "Fehler: Die INI konnte nicht gelesen werden" << endl;
    	}
    
    	cin.get();
    
    	return 0;
    }
    

    Hat jemand einen Tipp woran das liegen könnte?

    Gruß Thorsten

    PS: Ich habe tatsächlich die Suchfunktion verwendet. Die Ergebnise beantworten meine Frage jedoch nicht, da ich cin.get verwende, bzw. auf eine Eingabe warte bevor die Console geschlossen wird. 🙂



  • Hallo,

    ich bin etwas weiter gekommen. Anscheinend liegt es am Compiler. Ich habe Testweise Dev-C++ heruntergeladen und den Code von oben unverändert eingefügt.

    Das funktioniert. Schön wäre, wenn ich Visual Studio 2010 nutzen könnte. Ich nehme an die Kenner wissen die Unterschiede. Kann ich VS Studio dazu bringen meinen Code Lauffähig zu installieren?

    Wichtig ist dass ich auf den Zielsystemen keine Laufzeitdateien installieren kann. Daher muss ich mich mit C/C++ beschäftigen. Andernfalls würde ich nämlich glatt das .NET Framework installieren und kenne mich aus 🙂

    Gruß Thorsten



  • Also erstmal nur zu deiner Info: Für Visual-C++ Programme brauchst du immer eine Laufzeit, die Visual-C++-Runtime (CRT). Allerdings kannst du die statisch in die Exe einliken (gibt dann halt große Dateien), k.a. ob du das schon machst.

    Mit XP Embedded kenn ich mich leider überhaupt nicht aus.

    Aber probier mal testweise

    cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
    

    vor das cin.get() zu setzen (dementsprechend natürlich auch noch <limits> inkludieren). Zwar dürfte im Eingabebuffer eigentlich nix stehen, aber mehr fällt mir auch nicht ein, insbesondere weil es ja mit Dev-Cpp funktioniert.

    EDIT: Könnte es vielleicht auch sein, dass auf dem Embedded System nicht die entsprechende CRT installiert ist und das Programm deswegen abraucht?



  • Hallo,
    ich habe es hinbekommen. Statisch und einlinken waren die Schlüsselwörter welche zum Erfolg geführt haben 😉

    In den Projekteigenschaften unter C/C++->Codegenerierung habe ich beim Releasebuild die Laufzeitbibliothek auf Multithreaded (/MT) umgestellt.

    Danke.
    Gruß Thorsten



  • Freut mich, dass ich helfen konnte. 🙂
    Also doch Probleme mit der CRT. Dieses Ding ist doch immer die Wurzel allen Übels 😃

    Was mich aber nebenbei mal interessiert: Du schreibst, du würdest C++ nur verwenden weil du das .NET-Framework nicht zur Verfügung hast. Aber gibt es nicht speziell für eingebettete Systeme das .NET-Compact-Framework?

    Englische Wikipedia schrieb:

    The Microsoft .NET Compact Framework (.NET CF) is a version of the .NET Framework that is designed to run on resource constrained mobile/embedded devices such as personal digital assistants (PDAs), mobile phones, factory controllers, set-top boxes, etc.



  • Leider ist das nicht auf allen Zielcomputern gleichermaßen installiert, bzw. manche laufen auf einer 2GB CF-Karte. Speziell auf diesen Maschinen wurde u.a. alles was mit .NET zu tun hat, deinstalliert. 2 GB ist halt nicht so viel. Daher ist auch die Nachinstallation nicht möglich.



  • Achso, das ist dann natürlich was anders, wenn die nur 2GB haben.


Anmelden zum Antworten