如何获得硬件设备的句柄

faiqi 2003-10-30 10:26:02
比如一块PCI卡,如何获得其设备句柄 ,谢谢!
...全文
367 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangchun_xn 2003-11-11
  • 打赏
  • 举报
回复
learning
yayowd 2003-11-11
  • 打赏
  • 举报
回复
不懂!
781014 2003-11-08
  • 打赏
  • 举报
回复
学习
Atomictry 2003-11-04
  • 打赏
  • 举报
回复
学习。
hongliqiu 2003-10-31
  • 打赏
  • 举报
回复
学习~
Yuehj 2003-10-31
  • 打赏
  • 举报
回复
例如:
//打开一个设备
HANDLE hDevice = CreateFile("\\\\.\\PYCommPort0",GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(hDevice==INVALID_HANDLE_VALUE)return E_FAIL;

//与设备进行通讯
if(!DeviceIoControl(hDevice,PYCOMM_IOCTL_SETDATABITS,&comDataBits,sizeof(comDataBits),NULL,
0,&Status, NULL))

Yuehj 2003-10-31
  • 打赏
  • 举报
回复
首先要知道设备的符号连接(针对winnt环境)或设备ID(针对WDM驱动程序,WDM驱动程序有的也是使用符号连接)然后通过CreateFile函数打开设备,或使用DeviceIOControl直接与设备进行通讯。
sczyq 2003-10-31
  • 打赏
  • 举报
回复
//----------------------------------------------------
typedef struct NetCardStruct
{
DWORD Id; // 这就是你需要的设备句柄
AnsiString Name;
bool Enabled;
bool Changed;
bool IsDisable;
bool InitState;
} TNetCardStruct;
typedef TNetCardStruct* PNetCardStruct;
//---------------------------------------------------------------------------
void __fastcall EnumNetCards(TList *NetDeviceList)
{
AnsiString DevValue;
PNetCardStruct NetCard;
LPTSTR Buffer = NULL;
DWORD BufSize = 0;
HDEVINFO hDevInfo = 0;
if (INVALID_HANDLE_VALUE == (hDevInfo =
SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES)))
return;
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
for (DWORD DeviceId=0;
SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData); DeviceId++)
{
DevValue.SetLength(0);
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS , &Buffer, (PULONG)&BufSize))
DevValue = Buffer;
if (DevValue == "Net") // 判断设备是网卡
{
DevValue.SetLength(0);
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME , &Buffer, (PULONG)&BufSize))
DevValue = Buffer;
if (DevValue != "ROOT") // 判断设备不是虚拟设备
{
NetCard = new TNetCardStruct;
NetCard->Id = DeviceId;
NetCard->Name = "<Unknown Device>";
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER , &Buffer, (PULONG)&BufSize))
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC , &Buffer, (PULONG)&BufSize))
NetCard->Name = Buffer;
NetCard->Changed = false;
NetCard->IsDisable = false;
NetCard->Enabled = GetNetCardState(DeviceInfoData.DevInst) == gdsEnabled;
NetCard->InitState = NetCard->Enabled;
NetDeviceList->Add(NetCard);
}
}
}
}
//---------------------------------------------------------------------------
bool __fastcall GetRegistryProperty(HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData, ULONG Property, PVOID Buffer, PULONG Length)
{
while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
DeviceInfoData, Property, NULL, (BYTE *)*(TCHAR **)Buffer, *Length, Length))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (*(LPTSTR *)Buffer) LocalFree(*(LPTSTR *)Buffer);
*(LPTSTR *)Buffer = (PCHAR)LocalAlloc(LPTR,*Length);
}
else return false;
}
return (*(LPTSTR *)Buffer)[0];
}
sfemil 2003-10-30
  • 打赏
  • 举报
回复
你可以使用NetBios或者winsock等直接进行网络编程。你只要句柄干什么?

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧