用这种虚拟的串口时一般要用到串口的全名,不只是用"COMn"来打开
用这个函数可以得到串口的全名:# include   <stdio.h>
# include   <windows.h>
# include   <winioctl.h># include   <setupapi.h>
# include   <objbase.h>
# include   <initguid.h>#pragma comment(lib, "setupapi")DEFINE_GUID(GUID_CLASS_COMPORT, 0x86e0d1e0L, 0x8089, 0x11d0, 0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73);extern "C" BOOL GetVirtualComName(int nPort, char* szName)
{
    int         n, nVSD;
    DWORD       needed;
    BOOL        bFound = FALSE;
    HDEVINFO    info;
    SP_INTERFACE_DEVICE_DATA            ifdata;
    PSP_INTERFACE_DEVICE_DETAIL_DATA    detail = NULL;    n    = 0;
    nVSD = 0;    info = SetupDiGetClassDevs((LPGUID)&GUID_CLASS_COMPORT, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
    if (INVALID_HANDLE_VALUE == info)
    {
        return 0;
    }
    ifdata.cbSize = sizeof(ifdata);    n = nPort - 1;
    if (SetupDiEnumDeviceInterfaces(info, NULL, (LPGUID)&GUID_CLASS_COMPORT, n, &ifdata))
    {
        SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, &needed, NULL);
        detail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(needed);        if (!detail) return 0;        detail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
        if (!SetupDiGetDeviceInterfaceDetail(info, &ifdata, detail, needed, NULL, NULL))
        {
             return 0;
        }        strcpy(szName, detail->DevicePath);
        bFound = TRUE;
        free(detail);
        detail = NULL;
    }    if (detail)
    {
        free( detail );
    }    SetupDiDestroyDeviceInfoList(info);
    return bFound;
}

解决方案 »

  1.   

    第2个参数是返回获得的虚拟端口名字
    例如在CSerial中可以这样用:extern "C" BOOL GetVirtualComName(int nPort, char* szName);BOOL CSerial::Open( int nPort, long nBaud )
    {
    char szPort[100]; GetVirtualComName(nPort , szPort );
    //wsprintf( szPort, "COM%d", nPort );
    m_hIDComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
                          0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL
                          | FILE_FLAG_OVERLAPPED, NULL );
    ....