hur.cn - 华软网

 热门搜索

请教OnDeviceChange的问题

  作者:未知    来源:网络    更新时间:2009/2/5
我的OnDeviceChange总是收到7,搜索了一下发现是没有注册设备通知。
看了下面的帖子:
http://topic.csdn.net/t/20061013/11/5079590.html
需要注册
BOOL   CRSDlg::DoRegisterDeviceInterface(GUID   InterfaceClassGuid,   HDEVNOTIFY   *hDevNotify)  
{
 DEV_BROADCAST_DEVICEINTERFACE   NotificationFilter;  
          DWORD   Err;  
   
          ZeroMemory(   &NotificationFilter,   sizeof(NotificationFilter)   );  
          NotificationFilter.dbcc_size   =   32;  
                //   sizeof(DEV_BROADCAST_DEVICEINTERFACE);  
          NotificationFilter.dbcc_devicetype   =   DBT_DEVTYP_DEVICEINTERFACE;  
          NotificationFilter.dbcc_classguid   =   InterfaceClassGuid;  
   
          *hDevNotify   =   RegisterDeviceNotification(GetSafeHwnd(),   &NotificationFilter,  
                DEVICE_NOTIFY_WINDOW_HANDLE         );  
          if(!*hDevNotify)    
          {  
                  Err   =   GetLastError();  
  CString   str;  
  str.Format(_T("RegisterDeviceNotification   failed:   %lx."),Err);  
                  DT((LPCSTR)str);  
                  return   FALSE;  
          }  
    DT("RegisterDeviceNotification   Successed   :)");  
  //UnregisterDeviceNotification(*hDevNotify);  
          return   TRUE;   
}
我想问下这个函数是直接象普通函数那样增加的吗? 照旧要怎么样增加?什么时候才会调用到这个函数?
另外我加了这段代码之后,出现下面的毛病:
error C2065: 'RegisterDeviceNotification' : undeclared identifier
error C2065: 'DEVICE_NOTIFY_WINDOW_HANDLE' : undeclared identifier
error C2440: '=' : cannot convert from 'int' to 'void *'
        Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast
error C2065: 'DT' : undeclared identifier
有没有人知道怎么解决?
谢谢。
---华软 网友回答---
怎么没人回的? 顶一个。
---华软网友回复---
你想要干嘛?想知道有哪些设备有改变吗?

这个是要这个窗口注册以获得设备的消息通知而已

你这里明显是缺少头资料才会报错的嘛!查一下msdn不就知道了?


RegisterDeviceNotification
The RegisterDeviceNotification function specifies the device or type of device for which a window will receive notifications. 

HDEVNOTIFY RegisterDeviceNotification(
  HANDLE hRecipient,
  LPVOID NotificationFilter,
  DWORD Flags
);
Parameters
hRecipient 
[in] Handle to the window that will receive device events for the devices specified in the NotificationFilter parameter. The same window handle can be used in multiple calls to RegisterDeviceNotification. 
Services can specify either a window handle or service status handle. 

NotificationFilter 
[in] Pointer to a block of data that specifies the type of device for which notifications should be sent. This block always begins with the DEV_BROADCAST_HDR structure. The data following this header is dependent on the value of the dbch_devicetype member. 
Flags 
[in] Specifies the handle type. This parameter can be one of the following values. Type Description 
DEVICE_NOTIFY_WINDOW_HANDLE The hRecipient parameter is a window handle. 
DEVICE_NOTIFY_SERVICE_HANDLE The hRecipient parameter is a service status handle. 


Return Values
If the function succeeds, the return value is a device notification handle. 

If the function fails, the return value is NULL. To get extended error information, call GetLastError. 



Requirements 
  Windows NT/2000: Requires Windows 2000.
  Windows 95/98: Requires Windows 98.
  Header: Declared in Winuser.h; include Windows.h.
  Library: Use User32.lib.
  Unicode: Implemented as Unicode and ANSI versions on Windows 2000.


---华软网友回复---
另外能够在WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 函数中看看有没有WM_DEVICECHANGE这个消息
---华软网友回复---
谢谢楼上的, 我的VC MSDN 找不到RegisterDeviceNotification这个函数。加了Windows.h资料,照旧报错。
---华软网友回复---
引用 4 楼 moren123 的回复:
谢谢楼上的, 我的VC MSDN 找不到RegisterDeviceNotification这个函数。加了Windows.h资料,照旧报错。


  Header: Declared in Winuser.h; include Windows.h. 
  Library: Use User32.lib. 

---华软网友回复---
把User32.lib加入LINK中,同时把Winuser.h,windows.h都加上了,照旧有这个毛病,我的系统是在XP上,不知道有没有影响。
---华软网友回复---
有没有人知道啊? 顶起。
---华软网友回复---
这个函数需要有psdk的哦,你有没有装psdk呢?
---华软网友回复---
引用 8 楼 Allen_zhang 的回复:
这个函数需要有psdk的哦,你有没有装psdk呢?

platform sdk装了,然则在VC中显示有这个函数的啊。
---华软网友回复---
引用 8 楼 Allen_zhang 的回复:
这个函数需要有psdk的哦,你有没有装psdk呢?

Allen_zhang手头上有没有ondevicechange例子? 能不能发给我? blood107@163.com,谢谢.
---华软网友回复---
发现这个问题解决了,原因是由于我没有把PSDK的include上移到最上面。
但另有一个问题:
DoRegisterDeviceInterface(GUID   InterfaceClassGuid,   HDEVNOTIFY   *hDevNotify)
这个要在那里调用的?

---华软网友回复---
装一下SDK试试看
---华软网友回复---
DoRegisterDeviceInterface在你程序运用这个设备前调用。
---华软网友回复---
引用 11 楼 moren123 的回复:
发现这个问题解决了,原因是由于我没有把PSDK的include上移到最上面。 
但另有一个问题: 
DoRegisterDeviceInterface(GUID  InterfaceClassGuid,  HDEVNOTIFY  *hDevNotify) 
这个要在那里调用的? 


我通常为在初始化这个窗口的时候调用
---华软网友回复---
引用 11 楼 moren123 的回复:
发现这个问题解决了,原因是由于我没有把PSDK的include上移到最上面。 
但另有一个问题: 
DoRegisterDeviceInterface(GUID  InterfaceClassGuid,  HDEVNOTIFY  *hDevNotify) 
这个要在那里调用的? 


我通常为在初始化这个窗口的时候调用

由于还需要用窗口接收WM_DEVICECHANGE消息的
---华软网友回复---
引用 15 楼 Allen_zhang 的回复:
引用 11 楼 moren123 的回复:
发现这个问题解决了,原因是由于我没有把PSDK的include上移到最上面。
但另有一个问题:
DoRegisterDeviceInterface(GUID  InterfaceClassGuid,  HDEVNOTIFY  *hDevNotify)
这个要在那里调用的?


我通常为在初始化这个窗口的时候调用

由于还需要用窗口接收WM_DEVICECHANGE消息的

欠好意思,可能我问的不清楚,呵呵 我想问是这两个参数分别是几多? 措置惩罚USB的,呵呵。
---华软网友回复---
给你一段代码参照一下,你需要注册那个就注册响应的就好了
C++">
static const GUID GUID_DEVINTERFACE_LIST[] = 
{
// GUID_DEVINTERFACE_USB_DEVICE
{ 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } },

// GUID_DEVINTERFACE_DISK
{ 0x53f56307, 0xb6bf, 0x11d0, { 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b } },

// GUID_DEVINTERFACE_HID, 
{ 0x4D1E55B2, 0xF16F, 0x11CF, { 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 } },
 
// GUID_NDIS_LAN_CLASS
{ 0xad498944, 0x762f, 0x11d0, { 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c } }

};

//注册插拔事件
HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
for(int i=0; i<sizeof(GUID_DEVINTERFACE_LIST)/sizeof(GUID); i++) 
{
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_LIST[i];
hDevNotify = RegisterDeviceNotification(this->GetSafeHwnd(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
if( !hDevNotify ) 
        {
return FALSE;
}
}

---华软网友回复---
谢谢,能够编译成功了,然则此次插拔USB手机线的时候,都没有进入Ondevicechange里面的?
 还可能是什么问题?
---华软网友回复---
增加了消息映照了吗?
---华软网友回复---
谢谢,正是映照原因,揭贴了。
---华软网友回复---
good
---华软网友回复---
引用 6 楼 moren123 的回复:
把User32.lib加入LINK中,同时把Winuser.h,windows.h都加上了,照旧有这个毛病,我的系统是在XP上,不知道有没有影响。
你遇到的问题我也遇到过,解决了,还写了文档,看这:http://user.qzone.qq.com/343614534/blog/1249583059
---华软网友回复---
学习下,谢谢
---华软网友回复---
正需要。。。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。