Windows SDK 函数RegisterDeviceNotification失败问题

ragingbull123 2009-08-17 09:10:27
计划开发一个USB hid设备插拔检测程序。
在调用RegisterDeviceNotification()函数的时候总是注册失败。 如下是我的代码片断:

HidD_GetHidGuid(&m_guidHID);

// 注册设备的GUID,以便响应系统热拔插消息
// 设备的GUID, 不同的设备有不同的GUID,根据实际情况设定
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 = m_guidHID;

HDEVNOTIFY hNotifyDevNode;
hNotifyDevNode = RegisterDeviceNotification(hWnd,&DevInt, //hWnd我通过TForm类的Handle成员传入。
DEVICE_NOTIFY_WINDOW_HANDLE);
执行的结果是RegisterDeviceNotification()函数总是返回NULL。
开发环境是C++ Builder,SDK环境是Windows xp sp2 SDK.
多方查询资料无果,恳请大家指教。
...全文
792 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
thunder__god 2010-11-15
  • 打赏
  • 举报
回复
留个记号.......
fxworld 2009-08-21
  • 打赏
  • 举报
回复
//------------------------------------------------
修改下工程编译链接设置
//——————————————————————————

修改了哪几项?失败时是怎么设置的?
ragingbull123 2009-08-21
  • 打赏
  • 举报
回复
发现不是代码的问题,把工程文件*.bpr改动下,修改下工程编译链接设置就可以注册成功了。好奇怪的问题。
服了BORLAND了
ragingbull123 2009-08-19
  • 打赏
  • 举报
回复
可能是GUID不对?但我这个GUID是用SDK函数得到的,应该没有问题,HWnd的有效性也确认过了。但是就是注册不成功,郁闷了。
ragingbull123 2009-08-19
  • 打赏
  • 举报
回复
通过HidD_GetHidGuid()函数得到的GUID为:
m_guidHID = 4D1E55B2-F16F-11CF-88CB001111000030
ccrun.com 2009-08-19
  • 打赏
  • 举报
回复
RegisterDeviceNotification一行加个断点,看看m_guidHID的值。
ragingbull123 2009-08-19
  • 打赏
  • 举报
回复
GetLastError返回13, ERROR_INVALID_DATA.
ragingbull123 2009-08-19
  • 打赏
  • 举报
回复
谢谢,我把你的代码试了下,注册的成功,好像问题不是出在代码里面,而是出来编译环境里面,我新建的试验工程可以注册成功,但是我本来那个工程就是注册不成功,两个一样的代码,晕死了。
fxworld 2009-08-19
  • 打赏
  • 举报
回复

//按你给的GUID注册是成功的

HDEVNOTIFY g_hNotifyDevNode;
bool __fastcall DoRegisterDeviceInterface( GUID &m_guidHID )
{

DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
char szMsg[80];

ZeroMemory( ¬ificationFilter, sizeof(NotificationFilter) );
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = m_guidHID;

g_hNotifyDevNode = RegisterDeviceNotification( Form1->Handle,
¬ificationFilter,
DEVICE_NOTIFY_WINDOW_HANDLE
);

if( !g_hNotifyDevNode )
{
wsprintf(szMsg, "RegisterDeviceNotification failed: %d\n",
GetLastError());
MessageBox(Form1->Handle, szMsg, "Registration", MB_OK);
return FALSE;
}

return TRUE;



}
//------------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{

wchar_t *wchar = L"4D1E55B2-F16F-11CF-88CB001111000030";

GUID guid;
ZeroMemory( &guid,sizeof(GUID) );
CLSIDFromString( wchar,&guid );
//GuidFromString();

if( DoRegisterDeviceInterface( guid ) )
ShowMessage("Success");

}
//---------------------------------------------------------------------------
ccrun.com 2009-08-18
  • 打赏
  • 举报
回复
RegisterDeviceNotification以后,加一句:
ShowMessage(SysErrorMessage(GetLastError()));

看看提示什么.
mazm_yanzhu 2009-08-18
  • 打赏
  • 举报
回复
参考以下吧
http://topic.csdn.net/t/20030117/10/1367417.html

1,221

社区成员

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

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