给定deviceID和vendorID,能不能检测一个usb设备的插拔状况?

WoodJohn 2005-10-29 10:57:09
windows中有没有这样的函数?或者各位能不能帮忙写个程序?比如:
detect 0 //delay,检测到该usb设备插入就退出
detect 1 //delay,检测到该usb设备拔除就退出
我不会wdm,各位一定要帮忙哈!谢谢!!!!

...全文
735 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2006-05-26
  • 打赏
  • 举报
回复
mark
WoodJohn 2005-11-03
  • 打赏
  • 举报
回复
结贴了。谢谢大家!!
WoodJohn 2005-11-02
  • 打赏
  • 举报
回复
Featured大哥在吗?
yayaniuniu502 2005-10-31
  • 打赏
  • 举报
回复
给个简单的办法,你用
char Alldrivers[50];
GetLogicalDriveStrings(50,Alldrivers)得到所有的盘符,
然后用
UINT format;
format = GetDriveType((LPCTSTR)szDrive[i]);
注意:GetDriveType的参数类型应该为("D:"),所以应该对得到的字符串处理一下。
得到该盘的类型;
如果返回值为 2 The drive is a RAM disk.------------u盘
3 The disk cannot be removed from the drive.
5 The drive is a CD-ROM drive.

WoodJohn 2005-10-31
  • 打赏
  • 举报
回复
Featured大哥,我在编译时出了问题,无法找到IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR的定义。
我在MSDN中搜到了类似的IOCTL_GET_DEVICE_DESCRIPTOR,但这个用到了DDK。
大哥你能不能指点一下?谢谢!!
WoodJohn 2005-10-31
  • 打赏
  • 举报
回复
非常感谢两位的帮助!如果问题解决了的话,我会开贴再给100分。
WoodJohn 2005-10-31
  • 打赏
  • 举报
回复
非常感谢!
我希望在没有安装驱动的情况下就能检测出该设备。
当你在机器上插入一个硬件设备(比如U盘、网卡之类的东西)时,Windows会检测出该设备,并提示你安装驱动程序。我需要的就是Windows的这个检测功能。
我现在正在打包一个USB网络线的驱动程序。在主机上装好驱动后,可以通过WEB或者Telnet访问另一段连接的ADSL Modem。我希望在安装驱动的过程中,如果没有插入该设备(需要检查ID,以防用户插入其它设备的情形),则弹出一个对话框提示用户插入,然后该对话框自动消失,InstallShield继续安装驱动;如果已经插入,就不提示了。卸载的时候需要提示用户拔除该网线。注意我不是用InstallShield检测哦,是在弹出的对话框中完成的。
我觉得应该可以实现这样的功能,但是我不懂DDK:-(
程序流程是这样的:

查看该设备是否已经插入?(不一定装了驱动) //1.如何检测?
if(该设备没有插入)
{
弹出对话框提示用户插入该设备;
while(接收消息)
{
接收到WM_DEVICECHANGE消息;
if(插入的是该设备) //2.如何查看刚插入设备的ID?或者再次用1的方法。
关闭对话框;
break;
}
}
继续安装;

第一个问题解决了,一切就迎刃而解。
谢谢大家的关心!!
再次感谢Featured大哥!!我的手机号码已经用个人消息发给你了。
Featured 2005-10-31
  • 打赏
  • 举报
回复
首先我告诉你,你的问题肯定是不需要DDK的。这一点你放心。
(只要你具有该设备的驱动,该驱动中一般具有获取设备描述的函数)

为避免空对空,你先告诉我你使用的是什么USB芯片,有没有开发包?

【我会关注此贴,也可给我发短信】
WoodJohn 2005-10-31
  • 打赏
  • 举报
回复
谢谢楼上这位大哥了,不过我要做的是判断给定ID的USB网络线是否连上,跟U盘没有关系。
谢谢各位!!
billy145533 2005-10-30
  • 打赏
  • 举报
回复
这方面的东西都在ddk里面
我目前为止 还没看到 什么api或现成的函数
Featured 2005-10-30
  • 打赏
  • 举报
回复
还有,检测已有硬件能不能用API函数解决,我不熟悉DDK

这方面的东西都在ddk里面
我目前为止 还没看到 什么api或现成的函数

=====

真的不需要DDK,同志们!

我不知道你使用的是什么USB芯片,使用FX2芯片的范例如下:

typedef struct __usb_Dev_Descriptor__ {
UCHAR bLength;
UCHAR bDescriptorType;
USHORT bcdUSB;
UCHAR bDeviceClass;
UCHAR bDeviceSubClass;
UCHAR bDeviceProtocol;
UCHAR bMaxPacketSize0;
USHORT idVendor;
USHORT idProduct;
USHORT bcdDevice;
UCHAR iManufacturer;
UCHAR iProduct;
UCHAR iSerialNumber;
UCHAR bNumConfigurations;
} Usb_Device_Descriptor, *pUsb_Device_Descriptor;

strcat (completeDeviceName,
"\\\\.\\"
);


strcat (completeDeviceName,
"YourDriverName" //注意:这里改成你的USB设备名称
);

HANDLE hDevice = NULL;

hDevice= CreateFile( completeDeviceName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);

PVOID pvBuffer=NULL;
pvBuffer = malloc (sizeof (Usb_Device_Descriptor) + 128);
DWORD nBytes;
BOOL bResult;
bResult = DeviceIoControl (hDevice,
IOCTL_Ezusb_GET_DEVICE_DESCRIPTOR,
pvBuffer,
sizeof (Usb_Device_Descriptor),
pvBuffer,
sizeof (Usb_Device_Descriptor),
(unsigned long *)&nBytes,
NULL);


(需要安装了)
billy145533 2005-10-29
  • 打赏
  • 举报
回复
响应这个WM_DEVICECHANGE能够检测到硬件的插入和拔除
如果程序运行之前,要判断是否硬件已经存在
需要检测所有存在硬件的id
具体可以参考 ddk+里面的install里面的源码
Featured 2005-10-29
  • 打赏
  • 举报
回复
不需要WDM,只要响应一下WM_DEVICECHANGE事件就可以了
WoodJohn 2005-10-29
  • 打赏
  • 举报
回复
还有,如何才知道刚插入的设备的device ID?
WoodJohn 2005-10-29
  • 打赏
  • 举报
回复
我的消息写错了,换成WM_DEVICECHANGE是可以检测

还有,检测已有硬件能不能用API函数解决,我不熟悉DDK
WoodJohn 2005-10-29
  • 打赏
  • 举报
回复
谢谢2位大哥!但我的程序为什么不行呢?插拔USB后,那个对话框还时停在那儿
#include <dbt.h>
//...
BOOL CALLBACK PromptDlgProc (HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
HDC hdc;
HFONT holdfont,hnewfont;
PAINTSTRUCT ps;
RECT rect_client,rect_window;
int cxScreen,cyScreen;
DWORD dwExStyle;

switch (message)
{
case WM_INITDIALOG :
//...
return TRUE ;

case WM_PAINT :
//...
return true;
case DBT_DEVICEARRIVAL:
PostQuitMessage(0);
case DBT_DEVICEREMOVECOMPLETE:
PostQuitMessage(0);
}

return FALSE ;
}

Featured 2005-10-29
  • 打赏
  • 举报
回复
WM_DEVICECHANGE是一个被隐藏了的Windows消息,在ClassWizard里面根本看不到.
先需要自己写消息处理函数,
BOOL CxxxDlg::OnDeviceChange( UINT nEventType, DWORD dwData )
//试过了,返回值和参数改了也没有问题的

再到testMessageDlg.cpp中顶部的
BEGIN_MESSAGE_MAP(CTestDlgDlg, CDialog)
//{{AFX_MSG_MAP(CTestDlgDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_MESSAGE(WM_HELLOWORLD,OnHelloWorld)
ON_WM_TIMER()
//}}AFX_MSG_MAP
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()
加上
ON_WM_DEVICECHANGE()
这一行。
需要注意的是:最好加在如上面的那个位置,如果加在//}}AFX_MSG_MAP内部,那么ClassWizard会报错的!

2,643

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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