1

I working on a project where I have to get access to at COM port. I'm at the moment using winjcom to get access and to list the connected devices. My problem is that I would like to have the friendly names displayed instead of just COM3, COM4 and so on.

I found a thread

Getting device/driver information related to a COM port?

which can get the friendly name, but this is based on the face that i know the PID, VID and device ID. I would like to get it on all connected devices.

Hope you guys can help me. :)

Community
  • 1
  • 1
René Josefsen
  • 143
  • 2
  • 11

3 Answers3

1

Use JNA (https://github.com/twall/jna) and take a look at the following page. It might be a useful point to start from.

http://www.digitalinferno.com/wiki/Wiki.jsp?page=JNAPrintDevices

stefan222
  • 669
  • 1
  • 11
  • 30
0

As an example, I use the code from https://stackoverflow.com/a/15348278/398348 to call WinRegistry.getStringSubKeys(). See, You do not need to know the device id. You can use the same logic but may have to use recursion in your code to traverse through the lower branches.

Community
  • 1
  • 1
likejudo
  • 3,396
  • 6
  • 52
  • 107
0

This code uses the windows dll setupapi through JNA to get the description of the COM port :

final SetupApi2 setupApi = SetupApi2.INSTANCE;
int SPDRP_FRIENDLYNAME = 12;

WinNT.HANDLE handle = setupApi.SetupDiGetClassDevsA(null, null, null, SetupApi.DIGCF_ALLCLASSES);

SetupApi.SP_DEVINFO_DATA devInfo = new SetupApi.SP_DEVINFO_DATA();
int indice = 0;

while (setupApi.SetupDiEnumDeviceInfo (handle, indice, devInfo) 
    ) {
        char[] windowText1 = new char[255];
    IntByReference flag = new IntByReference(0);

    IntByReference PropertyRegDataType = new IntByReference();
    byte[] descripcionByte = new byte[255];

    if ((setupApi.SetupDiGetDeviceInstanceIdA(handle, devInfo, windowText1, windowText1.length, flag))) {
        if ((setupApi.SetupDiGetDeviceRegistryPropertyA(handle, devInfo, SPDRP_FRIENDLYNAME, PropertyRegDataType, descripcionByte, descripcionByte.length, flag))) {
            String descripcionString = Native.toString(descripcionByte);
            System.out.println(descripcionString);
        }
    }
    indice++;
}

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.platform.win32.Guid.GUID;
import com.sun.jna.platform.win32.SetupApi;
import com.sun.jna.platform.win32.SetupApi.SP_DEVICE_INTERFACE_DATA;
import com.sun.jna.platform.win32.SetupApi.SP_DEVINFO_DATA;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinNT;
import com.sun.jna.ptr.IntByReference;
import java.util.Arrays;
import java.util.List;

public interface SetupApi2 extends Library {

SetupApi2 INSTANCE = (SetupApi2) Native.loadLibrary("setupapi", SetupApi2.class);

public static class HDEVINFO extends WinNT.HANDLE {
}

public static class SP_DRVINFO_DATA extends Structure {

    public SP_DRVINFO_DATA() {
        DriverDate = new WinBase.FILETIME();
    }
    public int cbSize;
    public int DriverType;
    public int Reserved;
    public char[] Description = new char[255];
    public char[] MfgName = new char[255];
    public char[] ProviderName = new char[255];
    public WinBase.FILETIME DriverDate;
    public int DriverVersion;

    protected List getFieldOrder() {
        return Arrays.asList("cbSize",
                "DriverType",
                "Reserved",
                "Description",
                "MfgName",
                "ProviderName",
                "DriverDate",
                "DriverVersion");
    }
}

public static class SP_DEVICE_INTERFACE_DETAIL_DATA extends Structure {

    public static class ByReference extends SP_DEVINFO_DATA implements Structure.ByReference {

        public ByReference() {
        }

        public ByReference(Pointer memory) {
            super(memory);
        }
    }

    public SP_DEVICE_INTERFACE_DETAIL_DATA() {
        cbSize = size();
        setAlignType(Structure.ALIGN_NONE);
    }

    public SP_DEVICE_INTERFACE_DETAIL_DATA(int size) {
        cbSize = size();
        devicePath = new char[size];
        setAlignType(Structure.ALIGN_NONE);
    }

    public SP_DEVICE_INTERFACE_DETAIL_DATA(Pointer memory) {
        super(memory);
        read();
    }

    /**
     * The size, in bytes, of the SP_DEVINFO_DATA structure.
     */
    public int cbSize;

    public char[] devicePath = new char[1];

    protected List getFieldOrder() {
        return Arrays.asList("cbSize",
                "devicePath");
    }
}

public static int DIGCF_DEFAULT = 0x00000001;
public static int DIGCF_PRESENT = 0x00000002;
public static int DIGCF_ALLCLASSES = 0x00000004;
public static int DIGCF_PROFILE = 0x00000008;
public static int DIGCF_DEVICEINTERFACE = 0x00000010;
public static int SPDRP_DRIVER = 0x00000009;
public static int SPDRP_INSTALL_STATE = 0x00000022;

WinNT.HANDLE SetupDiGetClassDevsA(GUID Guid, String Enumerator, WinDef.HWND Parent, int Flags);

boolean SetupDiEnumDeviceInfo(WinNT.HANDLE DeviceInfoSet, int MemberIndex, SP_DEVINFO_DATA DeviceInfoData);

int SetupDiEnumDeviceInterfaces(HDEVINFO DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, GUID Guid, int MemberIndex, SP_DEVICE_INTERFACE_DATA DeviceInterfaceData);

int SetupDiGetDeviceInterfaceDetail(HDEVINFO DeviceInfoSet, SP_DEVICE_INTERFACE_DATA DeviceInterfaceData, SP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData, int DeviceInterfaceDetailDataSize, IntByReference RequiredSize, SP_DEVINFO_DATA DeviceInfoData);

int SetupDiDestroyDeviceInfoList(HDEVINFO DeviceInfoSet);

boolean SetupDiGetDeviceInstanceIdA(WinNT.HANDLE DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, char[] DeviceId, int DeviceInstanceIdSize, IntByReference RequiredSize);

boolean SetupDiClassNameFromGuid(GUID Guid, char[] ClassName, int ClassNameSize, IntByReference RequiredSize);

boolean SetupDiGetSelectedDriver(HDEVINFO DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, SP_DRVINFO_DATA DriverInfoData);

boolean SetupDiClassGuidsFromName(String ClassName, GUID[] ClassGuidList, int ClassGuidListSize, IntByReference RequiredSize);

boolean SetupDiGetDeviceRegistryPropertyA(WinNT.HANDLE DeviceInfoSet, SP_DEVINFO_DATA DeviceInfoData, int Property, IntByReference PropertyRegDataType, byte[] PropertyBuffer, int PropertyBufferSize, IntByReference RequiredSize);
}
François Maturel
  • 5,884
  • 6
  • 45
  • 50