救命啊,还是BCB下的USB连接设备识别问题

hai1039 2006-02-14 12:02:48
上次蒙几位大侠指导,写出下面程序.

#include <vcl.h>
#pragma hdrstop

#include <dbt>
#include "USBMsg_t.h"
#include "usbdi.h"
#include "devioctl.h"
#include <initguid.h>

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2,
0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED);

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
SetUSBNotify(NULL);
Application->HookMainWindow(AppHookFunc);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::SetUSBNotify(TObject *Sender)
{
DEV_BROADCAST_DEVICEINTERFACE DevInt;

memset(&DevInt,0,sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevInt.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE; //设备的 GUID, 不同的设备有不同的 GUID,根据实际情况设定
m_DevNotify = RegisterDeviceNotification(Application->Handle, &DevInt,
DEVICE_NOTIFY_WINDOW_HANDLE);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
UnregisterDeviceNotification(m_DevNotify);
Application->UnhookMainWindow(AppHookFunc);
}
//---------------------------------------------------------------------------

bool __fastcall TForm1::AppHookFunc(TMessage &Message)
{
bool handled = false;

int i;

switch(Message.Msg){
case WM_DEVICECHANGE:
switch(Message.WParam){
case DBT_DEVICEREMOVECOMPLETE:
if(IsOurUSBDevice(Message.LParam))
{
// pStatBar->Text = "请检查USB连线是否断开...";
i=1;
handled = true;
}
break;

case DBT_DEVICEARRIVAL:
if(IsOurUSBDevice(Message.LParam))
{
// pStatBar->Text = "USB设备接通";
i=2;
handled = true;
}
break;

default:
break;
}
break;

default:
break;
}

return handled;
}

bool __fastcall TForm1::IsOurUSBDevice(int iMsgLParam)
{
bool bRes = false;

DEV_BROADCAST_HDR *lpDevHdr = (DEV_BROADCAST_HDR*)iMsgLParam;
if(lpDevHdr->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE)
{
DEV_BROADCAST_DEVICEINTERFACE *lpb =
(DEV_BROADCAST_DEVICEINTERFACE *)iMsgLParam;

if(lpb->dbcc_classguid == GUID_DEVINTERFACE_USB_DEVICE) // check GUID to determine if that's our USB device
{
bRes = true;
}
}

return (bRes);
}

现在可以识别USB插拔时的DBT_DEVICEREMOVECOMPLETE和DBT_DEVICEARRIVAL.

可是发现插拔我们的USB采集设备和插拔一般USB鼠标,甚至U盘时收到的消息差不多,无法区分.

下面是用spy++抓到的消息:

<00001> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00002> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0015EA70
<00003> 00140368 R WM_DEVICECHANGE fComplete:False
<00004> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00005> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00006> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEREMOVECOMPLETE dwData:0015EA70
<00007> 00140368 R WM_DEVICECHANGE fComplete:False


<00008> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00009> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0015EA70
<00010> 00140368 R WM_DEVICECHANGE fComplete:False
<00011> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00012> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00013> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00014> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00015> 00140368 P WM_DEVICECHANGE Event:0007 dwData:00000000
<00016> 00140368 S WM_DEVICECHANGE Event:DBT_DEVICEREMOVECOMPLETE dwData:0015EA70
<00017> 00140368 R WM_DEVICECHANGE fComplete:False

1-7为我们的USB设备插拔时的消息, 8-17为另一USB鼠标插拔时产生的消息.
单步跟踪发现lpb->dbcc_classguid值完全一样.

不知道错在哪里?
...全文
422 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyyoung 2006-02-20
  • 打赏
  • 举报
回复
up
hai1039 2006-02-14
  • 打赏
  • 举报
回复
头文件为:
//---------------------------------------------------------------------------

#ifndef USBMsg_tH
#define USBMsg_tH
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
void __fastcall FormDestroy(TObject *Sender);

private: // User declarations

protected:


public: // User declarations
HDEVNOTIFY m_DevNotify;

__fastcall TForm1(TComponent* Owner);
char __fastcall TForm1::FirstDriveFromMask (ULONG unitmask);
bool __fastcall TForm1::AppHookFunc(TMessage &Message);
bool __fastcall TForm1::IsOurUSBDevice(int iMsgLParam);
void __fastcall TForm1::SetUSBNotify(TObject *Sender);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

和U盘插拔的比较

<00001> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00002> 002D04CC S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:00176E38
<00003> 002D04CC R WM_DEVICECHANGE fComplete:False
<00004> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00005> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00006> 002D04CC S WM_DEVICECHANGE Event:DBT_DEVICEREMOVECOMPLETE dwData:00176E38
<00007> 002D04CC R WM_DEVICECHANGE fComplete:False
<00008> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000

<00009> 002D04CC S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:00176E38
<00010> 002D04CC R WM_DEVICECHANGE fComplete:False
<00011> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00012> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00013> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00014> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00015> 002D04CC S WM_DEVICECHANGE Event:DBT_DEVICEARRIVAL dwData:0012FE64
<00016> 002D04CC R WM_DEVICECHANGE fComplete:True
<00017> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00018> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00019> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00020> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00021> 002D04CC S WM_DEVICECHANGE Event:DBT_DEVICEREMOVECOMPLETE dwData:0012FE64
<00022> 002D04CC R WM_DEVICECHANGE fComplete:True
<00023> 002D04CC S WM_DEVICECHANGE Event:DBT_DEVICEREMOVECOMPLETE dwData:00176E38
<00024> 002D04CC R WM_DEVICECHANGE fComplete:False
<00025> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000
<00026> 002D04CC P WM_DEVICECHANGE Event:0007 dwData:00000000

1-8 为我们的USB设备, 其余为一U盘插拔产生的消息
constantine 2006-02-14
  • 打赏
  • 举报
回复
USB鼠标我这里没有,无法测试了
hai1039 2006-02-14
  • 打赏
  • 举报
回复
问题解决,是GUID不对.

使用inf文件中的class_guid,和HKEY_LOCAL_MACHINE->System->ControlSet001和CurrentControlSet下的Enum->USB中诸GUID都不行.

根据inf文件中的VID和PID在注册表里搜索相关GUID, 试到第7个的时候成功了,在ControlSet002下.

1,221

社区成员

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

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