Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Categories

serial/com Port Names

jimbophobejimbophobe Member Posts: 7
Is there a way to discover the name of a com port from the device manager?
[img=http://i8.photobucket.com/albums/a24/jimnasty/devices.jpg]

i need to get that name. does anybody know how to get that?

thanks,
jim

Comments

  • HackmanCHackmanC Member Posts: 441
    Have you tried with Windows Management Instrumentation? Win32_SerialPort Class ?
    I can't be sure, but I believe you can get the Device Description from there.

    [code]class Win32_SerialPort : CIM_SerialController
    {
    uint16 Availability;
    boolean Binary;
    uint16 Capabilities[];
    string CapabilityDescriptions[];
    [color=Red]string Caption;[/color]
    uint32 ConfigManagerErrorCode;
    boolean ConfigManagerUserConfig;
    string CreationClassName;
    [color=Red]string Description;[/color]
    string DeviceID;
    boolean ErrorCleared;
    string ErrorDescription;
    datetime InstallDate;
    uint32 LastErrorCode;
    uint32 MaxBaudRate;
    uint32 MaximumInputBufferSize;
    uint32 MaximumOutputBufferSize;
    uint32 MaxNumberControlled;
    [color=Red]string Name;[/color]
    boolean OSAutoDiscovered;
    string PNPDeviceID;
    uint16 PowerManagementCapabilities[];
    boolean PowerManagementSupported;
    uint16 ProtocolSupported;
    string ProviderType;
    boolean SettableBaudRate;
    boolean SettableDataBits;
    boolean SettableFlowControl;
    boolean SettableParity;
    boolean SettableParityCheck;
    boolean SettableRLSD;
    boolean SettableStopBits;
    string Status;
    uint16 StatusInfo;
    boolean Supports16BitMode;
    boolean SupportsDTRDSR;
    boolean SupportsElapsedTimeouts;
    boolean SupportsIntTimeouts;
    boolean SupportsParityCheck;
    boolean SupportsRLSD;
    boolean SupportsRTSCTS;
    boolean SupportsSpecialCharacters;
    boolean SupportsXOnXOff;
    boolean SupportsXOnXOffSet;
    [color=Red]string SystemCreationClassName;
    string SystemName;[/color]
    datetime TimeOfLastReset;
    };[/code]
    http://msdn2.microsoft.com/en-us/library/aa394413.aspx


    [red]Good luck![/red]
    [blue]Hackman[/blue]
  • jimbophobejimbophobe Member Posts: 7
    Thank You!!

    that worked great- took me a bit to get what I wanted from it, but I had no idea about that class.


    : Have you tried with Windows Management Instrumentation?
    : Win32_SerialPort Class ?
    : I can't be sure, but I believe you can get the Device Description
    : from there.
    :
    : [code]: class Win32_SerialPort : CIM_SerialController
    : {
    : uint16 Availability;
    : boolean Binary;
    : uint16 Capabilities[];
    : string CapabilityDescriptions[];
    : [color=Red]string Caption;[/color]
    : uint32 ConfigManagerErrorCode;
    : boolean ConfigManagerUserConfig;
    : string CreationClassName;
    : [color=Red]string Description;[/color]
    : string DeviceID;
    : boolean ErrorCleared;
    : string ErrorDescription;
    : datetime InstallDate;
    : uint32 LastErrorCode;
    : uint32 MaxBaudRate;
    : uint32 MaximumInputBufferSize;
    : uint32 MaximumOutputBufferSize;
    : uint32 MaxNumberControlled;
    : [color=Red]string Name;[/color]
    : boolean OSAutoDiscovered;
    : string PNPDeviceID;
    : uint16 PowerManagementCapabilities[];
    : boolean PowerManagementSupported;
    : uint16 ProtocolSupported;
    : string ProviderType;
    : boolean SettableBaudRate;
    : boolean SettableDataBits;
    : boolean SettableFlowControl;
    : boolean SettableParity;
    : boolean SettableParityCheck;
    : boolean SettableRLSD;
    : boolean SettableStopBits;
    : string Status;
    : uint16 StatusInfo;
    : boolean Supports16BitMode;
    : boolean SupportsDTRDSR;
    : boolean SupportsElapsedTimeouts;
    : boolean SupportsIntTimeouts;
    : boolean SupportsParityCheck;
    : boolean SupportsRLSD;
    : boolean SupportsRTSCTS;
    : boolean SupportsSpecialCharacters;
    : boolean SupportsXOnXOff;
    : boolean SupportsXOnXOffSet;
    : [color=Red]string SystemCreationClassName;
    : string SystemName;[/color]
    : datetime TimeOfLastReset;
    : };[/code]:
    : http://msdn2.microsoft.com/en-us/library/aa394413.aspx
    :
    :
    : [red]Good luck![/red]
    : [blue]Hackman[/blue]

  • ketiketi Member Posts: 1
    Hello,

    I have the same problem with finding friendly names of COM ports as they appear in Device Manager. I'm new in C++ MFC programming, so can you please post some sample code how did you do this?
    Thanks a lot.

    Katerina

    : Thank You!!
    :
    : that worked great- took me a bit to get what I wanted from it, but
    : I had no idea about that class.
    :
    :
    : : Have you tried with Windows Management Instrumentation?
    : : Win32_SerialPort Class ?
    : : I can't be sure, but I believe you can get the Device Description
    : : from there.
    : :
    : : [code]: : class Win32_SerialPort : CIM_SerialController
    : : {
    : : uint16 Availability;
    : : boolean Binary;
    : : uint16 Capabilities[];
    : : string CapabilityDescriptions[];
    : : [color=Red]string Caption;[/color]
    : : uint32 ConfigManagerErrorCode;
    : : boolean ConfigManagerUserConfig;
    : : string CreationClassName;
    : : [color=Red]string Description;[/color]
    : : string DeviceID;
    : : boolean ErrorCleared;
    : : string ErrorDescription;
    : : datetime InstallDate;
    : : uint32 LastErrorCode;
    : : uint32 MaxBaudRate;
    : : uint32 MaximumInputBufferSize;
    : : uint32 MaximumOutputBufferSize;
    : : uint32 MaxNumberControlled;
    : : [color=Red]string Name;[/color]
    : : boolean OSAutoDiscovered;
    : : string PNPDeviceID;
    : : uint16 PowerManagementCapabilities[];
    : : boolean PowerManagementSupported;
    : : uint16 ProtocolSupported;
    : : string ProviderType;
    : : boolean SettableBaudRate;
    : : boolean SettableDataBits;
    : : boolean SettableFlowControl;
    : : boolean SettableParity;
    : : boolean SettableParityCheck;
    : : boolean SettableRLSD;
    : : boolean SettableStopBits;
    : : string Status;
    : : uint16 StatusInfo;
    : : boolean Supports16BitMode;
    : : boolean SupportsDTRDSR;
    : : boolean SupportsElapsedTimeouts;
    : : boolean SupportsIntTimeouts;
    : : boolean SupportsParityCheck;
    : : boolean SupportsRLSD;
    : : boolean SupportsRTSCTS;
    : : boolean SupportsSpecialCharacters;
    : : boolean SupportsXOnXOff;
    : : boolean SupportsXOnXOffSet;
    : : [color=Red]string SystemCreationClassName;
    : : string SystemName;[/color]
    : : datetime TimeOfLastReset;
    : : };[/code]: :
    : : http://msdn2.microsoft.com/en-us/library/aa394413.aspx
    : :
    : :
    : : [red]Good luck![/red]
    : : [blue]Hackman[/blue]
    :
    :

  • jimbophobejimbophobe Member Posts: 7
    : Hello,
    :
    : I have the same problem with finding friendly names of COM ports as
    : they appear in Device Manager. I'm new in C++ MFC programming, so
    : can you please post some sample code how did you do this?
    : Thanks a lot.
    :
    : Katerina
    :


    Here is what I ended up doing. i found most of this in the MSDN and just massaged it a little to get what I wanted.
    I reformatted it a little to get it to display here better..


    #define _WIN32_DCOM
    #include
    #include
    #include
    using namespace std;
    #include
    #include

    # pragma comment(lib, "wbemuuid.lib")


    namespace FindMyPort
    {
    int GetPortNum(char *strCom)
    {
    HRESULT hres;
    int resFlag;
    char *FindMe;
    // Step 1: --------------------------------------------------
    // Initialize COM. ------------------------------------------

    FindMe=new (char);
    resFlag=0;
    hres = CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres))
    {

    resFlag= -1; // Program has failed.
    }

    // Step 2: --------------------------------------------------
    // Set general COM security levels --------------------------
    // Note: If you are using Windows 2000, you need to specify -
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
    // parameter of CoInitializeSecurity ------------------------

    hres = CoInitializeSecurity(
    NULL,
    -1, // COM authentication
    NULL, // Authentication services
    NULL, // Reserved
    RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
    RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
    NULL, // Authentication info
    EOAC_NONE, // Additional capabilities
    NULL // Reserved
    );


    if (FAILED(hres))
    {

    CoUninitialize();
    resFlag= -2; // Program has failed.
    }

    // Step 3: ---------------------------------------------------
    // Obtain the initial locator to WMI -------------------------

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
    CLSID_WbemLocator,
    0,
    CLSCTX_INPROC_SERVER,
    IID_IWbemLocator, (LPVOID *) &pLoc);

    if (FAILED(hres))
    {

    CoUninitialize();
    resFlag=-3; // Program has failed.
    }

    // Step 4: -----------------------------------------------------
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;

    // Connect to the rootcimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
    _bstr_t(L"ROOT\CIMV2"), // Object path of WMI namespace
    NULL, // User name. NULL = current user
    NULL, // User password. NULL = current
    0, // Locale. NULL indicates current
    NULL, // Security flags.
    0, // Authority (e.g. Kerberos)
    0, // Context object
    &pSvc // pointer to IWbemServices proxy
    );

    if (FAILED(hres))
    {
    //cout << "Could not connect. Error code = 0x"
    // << hex << hres << endl;
    pLoc->Release();
    CoUninitialize();
    resFlag=-4; // Program has failed.
    }




    // Step 5: --------------------------------------------------
    // Set security levels on the proxy -------------------------

    hres = CoSetProxyBlanket(
    pSvc, // Indicates the proxy to set
    RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
    RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
    NULL, // Server principal name
    RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
    RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
    NULL, // client identity
    EOAC_NONE // proxy capabilities
    );

    if (FAILED(hres))
    {
    //cout << "Could not set proxy blanket. Error code = 0x"
    // << hex << hres << endl;
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    resFlag=-5; // Program has failed.
    }

    // Step 6: --------------------------------------------------
    // Use the IWbemServices pointer to make requests of WMI ----

    // For example, get the name of the operating system
    IEnumWbemClassObject* pEnumerator = NULL;
    hres = pSvc->ExecQuery(
    bstr_t("WQL"),
    //bstr_t("SELECT * FROM Win32_OperatingSystem"),
    bstr_t("SELECT * FROM Win32_SerialPort"),
    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
    NULL,
    &pEnumerator);

    if (FAILED(hres))
    {
    //// cout << "Query for operating system name failed."
    // << " Error code = 0x"
    // << hex << hres << endl;
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();
    resFlag=-6; // Program has failed.
    }

    // Step 7: -------------------------------------------------
    // Get the data from the query in step 6 -------------------

    IWbemClassObject *pclsObj;
    ULONG uReturn = 0;


    while (pEnumerator)
    {
    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
    &pclsObj, &uReturn);

    if(0 == uReturn)
    {
    break;
    }

    VARIANT vtName, vtCap, vtDesc, vtStat, vtDev;

    // Get the value of the Name property
    hr = pclsObj->Get(L"Name", 0, &vtName, 0, 0);
    hr = pclsObj->Get(L"Caption", 0, &vtCap, 0, 0);
    hr = pclsObj->Get(L"Description", 0, &vtDesc, 0, 0);
    hr = pclsObj->Get(L"Status", 0, &vtStat, 0, 0);
    hr = pclsObj->Get(L"DeviceID", 0, &vtDev, 0, 0);


    strcpy(FindMe,(char *)vtName.bstrVal);
    if(strstr(strCom, FindMe)>=0)
    {
    strcpy(FindMe,(char *)vtDev.bstrVal);
    memcpy(FindMe, FindMe+3, 3);
    resFlag=atoi(FindMe);

    break;
    }



    VariantClear(&vtName);
    VariantClear(&vtCap);
    VariantClear(&vtDesc);
    VariantClear(&vtStat);
    VariantClear(&vtDev);
    }

    // Cleanup
    // ========

    pSvc->Release();
    pLoc->Release();
    pEnumerator->Release();
    pclsObj->Release();
    CoUninitialize();

    return resFlag;

    }
    }


Sign In or Register to comment.