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


von technikus (Gast)


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

von C# (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


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?

von bluppdidupp (Gast)


Lesenswert?

Damit kommt man an die Namen der verfügbaren COM-Ports:
1
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!):
1
public class SerialPortInfo
2
        {
3
            public string DosName = "";
4
            public string DeviceName = "";
5
        }
6
7
        public static List<SerialPortInfo> GetSerialPorts()
8
        {
9
            List<SerialPortInfo> ports = new List<SerialPortInfo>();
10
11
            using (RegistryKey rk = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false))
12
            {
13
                string[] valNames=rk.GetValueNames();
14
15
                foreach (string deviceName in valNames)
16
                {
17
                    string dosName=rk.GetValue(deviceName) as string;
18
                    SerialPortInfo spi = new SerialPortInfo();
19
                    spi.DosName = dosName;
20
21
                    if (deviceName.StartsWith("\\"))
22
                    {
23
                        spi.DeviceName = deviceName;
24
                    }
25
                    else
26
                    {
27
                        spi.DeviceName = "\\device\\" + deviceName;
28
                    }
29
30
                    ports.Add(spi);
31
                }
32
            }
33
34
            return ports;
35
        }

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

von technikus (Gast)


Lesenswert?

@ bluppdidupp:

Vielen dank für deine wertvollen Tipps!

Ich bin zwar "noch" C# Einsteiger und kann
1
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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.