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
Eventuell findest du was passendes in der Windows API. www.pinvoke.net könnte dir da vllt weiterhelfen.
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?
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.