mikrocontroller.net

Forum: PC-Programmierung c# Comports externer anwendungen schließen / Status ermitteln


Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kennt ihr eine Möglichkeit, die verwendeten Com Ports, die von externen 
Anwendungen benutzt werden zu schließen?

Idealerweise möchte ich so etwas in c# realisieren.

Zudem suche ich eine Möglichkeit in c# an den Eintrag des COM Ports aus 
dem Gerätemanager zu "holen" bzw. von welchem Programm der Port geöffnet 
wurde.

Danke und Gruß
technikus

Autor: C# (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell findest du was passendes in der Windows API. www.pinvoke.net 
könnte dir da vllt weiterhelfen.

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
technikus schrieb:
> kennt ihr eine Möglichkeit, die verwendeten Com Ports, die von externen
> Anwendungen benutzt werden zu schließen?

Hmm, durch beenden der "externen" Anwendungen?

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit kommt man an die Namen der verfügbaren COM-Ports:
string[] portNames=SerialPort.GetPortNames();

Herausfinden welche Anwendung einen COM-Port belegt erfordert einen 
Treiber (für Dateien hätte UserMode ausgereicht, siehe z.B.: 
http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx)

Mein Tipp:
Hol dir den DeviceName aus der Registry und frag Handle.exe nach der 
Anwendung die da den COM-Port blockiert.

DeviceNames der COM-Ports holen (ab Win2k/XP, nicht Win9x und älter!):
public class SerialPortInfo
        {
            public string DosName = "";
            public string DeviceName = "";
        }

        public static List<SerialPortInfo> GetSerialPorts()
        {
            List<SerialPortInfo> ports = new List<SerialPortInfo>();

            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false))
            {
                string[] valNames=rk.GetValueNames();

                foreach (string deviceName in valNames)
                {
                    string dosName=rk.GetValue(deviceName) as string;
                    SerialPortInfo spi = new SerialPortInfo();
                    spi.DosName = dosName;

                    if (deviceName.StartsWith("\\"))
                    {
                        spi.DeviceName = deviceName;
                    }
                    else
                    {
                        spi.DeviceName = "\\device\\" + deviceName;
                    }

                    ports.Add(spi);
                }
            }

            return ports;
        }

Handle.exe Aufruf z.B.: "handle.exe -a \Device\Winachsf0" - 
"\Device\Winachsf0" ist dabei der DeviceName.

Handle.exe: http://technet.microsoft.com/en-us/sysinternals/bb896655

Autor: technikus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ bluppdidupp:

Vielen dank für deine wertvollen Tipps!

Ich bin zwar "noch" C# Einsteiger und kann
List<SerialPortInfo> ports = new List<SerialPortInfo>();

"<>" zwar noch nicht nachvollziehen. Nach einem Blick in die Registry 
ist aber klar das ich den Namen benötige.

Ich habe bloß noch nicht verstanden wie ich handle.exe anschmeiße.

Danke!

Gruß
technikus

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.