Autor Beitrag
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.03.09 11:30 
Hallo an alle.

Kann man irgendwie abfragen, ob die laufende Anwendung eine WindowsForms- oder eine Konsolenanwendung ist?

Motivation: Ich will dadurch festlegen können, ob ich meine Exceptions über eine MessageBox oder die Console ausgebe.

Wenn es nicht geht, hätte ich schon eine eigene Lösung. Aber ich nehme natürlich gerne eine vorhandene Lösung.

Danke.
Christian
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 07.03.09 11:57 
Geht es um ein Projekt, das du mal als Konsolen- und mal als SWF-Anwendung kompilierst, oder um eine Klassenbibliothek, die in unterschiedlichen Projekten benutzt werden soll?
Wenn Ersteres zutrifft, könntest du ein wenig mit MSBuild herumspielen: Füge hinter der letzten PropertyGroup
ausblenden XML-Daten
1:
2:
3:
  <PropertyGroup Condition="'$(OutputType)'=='Exe'">
    <DefineConstants>$(DefineConstants);CONSOLE</DefineConstants>
  </PropertyGroup>

hinzu, im Code kannst du dann #if CONSOLE ... #else ... #endif benutzen.
Falls Letzteres zutrifft, dann haben Fehlermeldungen an den User dort nix verloren ;) . Gib sie per Exception an die Anwendung weiter, die sie dann anzeigen soll.

_________________
>λ=
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 07.03.09 11:58 
Ich glaube nicht, dass es in C# eine vordefinierte Möglichkeit zum Lesen des PE-Headers gibt. Also wirst du wohl mit einem Stream darauf zugreifen müssen, wenn es um ein fremdes Programm geht.
Mehr dazu findest du in der Beschreibung des PE-Headers bei Microsoft:
msdn.microsoft.com/e...ibrary/ms809762.aspx

Das interessante Feld für dich ist im Teil IMAGE_OPTIONAL_HEADER das Feld Subsystem, die beiden für dich interessanten Werte sind WINDOWS_GUI (Graphical User Interface) und WINDOWS_CUI (Character User Interface).

Wenn es dein eigenes Projekt ist, dann ist das was user profile iconKha geschrieben hat interessanter.
Christian R.
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 07.03.09 12:44 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
Falls Letzteres zutrifft, dann haben Fehlermeldungen an den User dort nix verloren ;) . Gib sie per Exception an die Anwendung weiter, die sie dann anzeigen soll.

Es geht um meinen XML-Adapter, den ich grad schreibe. Also eine rein funktionelle und wiederverwendbare Klasse.

Ja, ich habe auch schon überlegt die Ausgabe in das View zu legen. Allerdings ist das Problem, dass mein Mitprogrammierer, welcher für die GUI verantwortlich ist, mit CSharp seine erste OOP-Programmiersprache erlernt. Ich habe genug damit zu tun ihm die wichtigesten Grundlagen und Kniffe zu zeigen. Für mich ist es da aufgrund von Delphi-Erfahrungen schon einfacher.

Aber Du hast auf jeden Fall recht.

Habe erst einmal folgenden Workaround:

Classes/Tools/Program.cs
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
namespace Classes.Tools
{
    static public class Program
    {
        public const int APPTYPE_UNKNOWN = 0;
        public const int APPTYPE_CONSOLE = 1;
        public const int APPTYPE_WINFORM = 2;

        static public int AppType = APPTYPE_UNKNOWN;
    }
}


Classes/Tools/Message.cs
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
using System;
using System.Windows.Forms;

namespace Classes.Tools
{
    static public class Message
    {
        static public void ShowException(string pTitle, string pMessage)
        {
            /*
             * Die verwendete generische Klasse "Program" ist
             * die o. g. aus dem Namespace "Classes.Tools"
             */

            if (Program.AppType == Program.APPTYPE_CONSOLE)
            {
                Console.WriteLine(pTitle + ": " + pMessage);
            }
            if (Program.AppType == Program.APPTYPE_WINFORM)
            {
                MessageBox.Show(pMessage, pTitle, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        static public void ShowException(string pTitle, Exception pException)
        {
            ShowException(pTitle, pException.Message);
        }

        static public void ShowException(Exception pException)
        {
            ShowException("Ausnahmefehler", pException.Message);
        }
    }
}


Classes/Xml/Adapter.cs
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
using System;
using System.IO;

namespace Classes.Xml
{
    class Adapter
    {
        public Adapter()
        {
        }

        public Adapter(String pPath)
        {
            this._path = pPath;
            this._data = new System.Xml.XmlDocument();
            try
            {
                this._data.Load(this._sourceFile);
            }
            catch (DirectoryNotFoundException)
            {
                Tools.Message.ShowException("IO-Fehler""Pfad der XML-Ressource nicht gefunden.\n\n" + this._path);
            }
            catch (FileNotFoundException)
            {
                Tools.Message.ShowException("IO-Fehler""XML-Ressource nicht gefunden.\n\n" + this._path);
            }
            catch (IOException)
            {
                Tools.Message.ShowException("IO-Fehler""Unbekannter IO-Fehler beim Laden der XML-Ressource.\n\n" + this._path);
            }
            catch (Exception e)
            {
                Tools.Message.ShowException("Ausnahmefehler( XML-Adapter )", e);
            }
        }

        private String _path;

        private System.Xml.XmlDocument _data;
    }
}


(Anwendung) Program.cs
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
using System;
using System.Windows.Forms;

namespace AdDresser
{
    static public class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            // Program-Setup
            Classes.Tools.Program.AppType = Classes.Tools.Program.APPTYPE_WINFORM;

            // IDE
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormStartmenu());
        }
    }
}


So stelle ich jetzt im Prinzip über eine generische Klasse den Typ der Anwendung ein. Ist sicher noch nicht Optimal, aber doch sehr einfach nutzbar.

Werde sicher bei Gelegenheit ein Exception-Handling für die GUI implementieren. (Es gibt immer so viel, was man gerne bei Gelegenheit machen möchte.)

Danke Euch Zweien.
Christian
Greenberet
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 339
Erhaltene Danke: 20

Win 10
C# (VS 2012), C++ (VS 2012/GCC), PAWN(Notepad++), Java(NetBeans)
BeitragVerfasst: Sa 07.03.09 14:23 
als alternative bietet sich auch noch die Möglichkeit der Assembly Klasse.
Hiermit könntest du checken ob das Programm einen verweis auf "system.windows.forms.dll" besitzt.
Wenn Ja -> höchst wahrscheinlich eine Windows Form Application.
Wenn Nein -> sicherlich keine Windows Forms Application.( WPF oder Konsole )