typedef struct
{
CHAR *PortPath;
CHAR *PortFriendlyName;
} SERIAL_PORT,*LPSERIAL_PORT;
BOOL doEnumSerialPort(LPSERIAL_PORT Port,LPDWORD PortCount)
{
HDEVINFO hDevInfo,hTmpDevInfo;
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData;
SP_DEVINFO_DATA DevInfo;
ULONG i = 0;
ULONG requiredSize;
ULONG dwError = 0;
BOOL bReturn;
CHAR Buffer[256];
*PortCount=0;
hTmpDevInfo=SetupDiCreateDeviceInfoList(NULL, NULL);
hDevInfo = SetupDiGetClassDevsEx(&GUID_DEVCLASS_PORTS,
NULL,
NULL,
DIGCF_PRESENT|DIGCF_DEVICEINTERFACE ,
hTmpDevInfo,
NULL,
NULL);
while (TRUE)
{
deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
if (SetupDiEnumDeviceInterfaces(hDevInfo, 0, &GUID_DEVCLASS_PORTS, i, &deviceInterfaceData))
{
bReturn = SetupDiGetDeviceInterfaceDetail(hDevInfo,
&deviceInterfaceData,
NULL,
0,
&requiredSize,
NULL
);
DeviceInterfaceDetailData =(PSP_DEVICE_INTERFACE_DETAIL_DATA ) LocalAlloc(LPTR, requiredSize);
DeviceInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
DevInfo.cbSize=sizeof(SP_DEVINFO_DATA);
bReturn = SetupDiGetDeviceInterfaceDetail(hDevInfo,
&deviceInterfaceData,
DeviceInterfaceDetailData,
requiredSize,
NULL,
&DevInfo);
if (!bReturn)
{
dwError = GetLastError();
LocalFree(DeviceInterfaceDetailData);
break;
}
else
{
OutputDebugString(DeviceInterfaceDetailData->DevicePath);
OutputDebugString("\n");
Port.PortPath=_strdup(DeviceInterfaceDetailData->DevicePath);
LocalFree(DeviceInterfaceDetailData);
}
SetupDiGetDeviceRegistryProperty(hDevInfo,&DevInfo,SPDRP_FRIENDLYNAME,NULL,NULL,0,&requiredSize);
SetupDiGetDeviceRegistryProperty(hDevInfo,&DevInfo,SPDRP_FRIENDLYNAME,NULL,(UCHAR*)Buffer,requiredSize,NULL);
Port.PortFriendlyName=_strdup(Buffer);
}
else
{
dwError = GetLastError();
break;
}
i++;
}
SetupDiDestroyDeviceInfoList(hDevInfo);
*PortCount=i;
return TRUE;
}
Как узнать адрес COM порта
Помогите получить базовый адрес COM9 порта
приведите пример - что конекретно вы хотите и что не получается.
естественно - из найденного на форуме.
Цитата: kot_
приведите пример - что конекретно вы хотите и что не получается.
Есть готовое консольное приложение , в котором используется следующее:
static int base0=0x3f8;// базовый адрес 1 com порта
.
.
.
outportb (base0,cmd);
Как мне получить в base0 базовый адрес 9-го com порта
Впрочем можете пробовать - в одном из форумов наткнулся на подобный код - думаю это то что вам необходимо (после определенной доработки и чтения МСДН)
Код:
Насколько мне известно - к виртуальному порту вы можете обращаться только по имени, а не по адресу (которого у него нет)
Физических портов насколько мне известно только два - COM1 и COM2 (и то на новых компьютерах их может быть меньше - 1 или 0). Все у которых номер больше 2 - это виртуальные порты. Никакого физического воплощения они не имеют. По крайней мере в виде COM порта (вот у меня 3G можем - это два порта - COM21 и COM22). Соответственно можно обратиться только средствами ОС.
Я просто предположил, что возможно автор борется с виртуальным портом - так как сам он ничего об этом не сказал. Но на самом деле никто не мешает установить например плату расширения или две - тогда физический COM9 вполне будет иметь место (и адрес)
Сталкивался ровно с такой же задачей. Была плата и из под ДОСа выполнялась команда outport(0xf7-что-то там). Под виндой 95 работало хорошо, а под NT ругалась на privileged instruction или как-то так, уже не помню. Писали драйвер, который работал на более низком уровне защиты.