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