用这种虚拟的串口时一般要用到串口的全名,不只是用"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;
}
用这个函数可以得到串口的全名:# 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;
}
例如在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 );
....