Win32 DLL 中 RegisterDeviceNotification() 无法注册 没有人回贴呢???????????
时间:2011-11-14
来源:互联网
在Win32 DLL中 CreateDialog,然后通过调用RegisterDeviceNotification,在DialogProc函数中侦测相关信息。
RegisterDeviceNotification()无法注册成功, 返回错误:0x0000000d 数据无效。
代码如下:
HINSTANCE hinst = NULL;
HWND hwndDLG = NULL;
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static const GUID GUID_DEVINTERFACE = {0x6BDD1FC6,0x810F,0x11D0,0xBE,0xC7,0x08,0x00,0x2B,0xE2,0x09,0x2F};
void ShowDlg();
BOOL WINAPI DllMain(HANDLE hModule, DWORD dwFunction,LPVOID lpNot)
{
switch (dwFunction)
{
case DLL_PROCESS_ATTACH:
hinst = (HINSTANCE)hModule;
ShowDlg();
break;
case DLL_PROCESS_DETACH:
break;
}
void ShowDlg()
{
hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_MSG_DLG),NULL,(DLGPROC)DlgProc);
ShowWindow(hwndDLG, SW_SHOW);
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_DEVICEINTERFACE pDevInf=NULL;
switch(message)
{
case WM_INITDIALOG:
HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE;
hDevNotify = RegisterDeviceNotification(hDlg, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
return TRUE;
case WM_COMMAND:
return TRUE;
case WM_CLOSE:
DestroyWindow(hDlg);
hwndDLG = NULL;
return TRUE;
case WM_DEVICECHANGE:
if ( DBT_DEVICEARRIVAL == wParam
|| DBT_DEVICEREMOVECOMPLETE == wParam
/*|| DBT_DEVNODES_CHANGED == wParam*/)
{
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
// lParam = NULL;
switch( pHdr->dbch_devicetype )
{
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
//UpdateDevice(pDevInf, wParam);//后面根据pDevInf进一步判断,这还要自己实现
break;
}
}
return 0;
break;
}
return FALSE;
}
RegisterDeviceNotification()无法注册成功, 返回错误:0x0000000d 数据无效。
代码如下:
HINSTANCE hinst = NULL;
HWND hwndDLG = NULL;
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
static const GUID GUID_DEVINTERFACE = {0x6BDD1FC6,0x810F,0x11D0,0xBE,0xC7,0x08,0x00,0x2B,0xE2,0x09,0x2F};
void ShowDlg();
BOOL WINAPI DllMain(HANDLE hModule, DWORD dwFunction,LPVOID lpNot)
{
switch (dwFunction)
{
case DLL_PROCESS_ATTACH:
hinst = (HINSTANCE)hModule;
ShowDlg();
break;
case DLL_PROCESS_DETACH:
break;
}
void ShowDlg()
{
hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_MSG_DLG),NULL,(DLGPROC)DlgProc);
ShowWindow(hwndDLG, SW_SHOW);
}
BOOL CALLBACK DlgProc(HWND hDlg, UINT message,
WPARAM wParam, LPARAM lParam)
{
PDEV_BROADCAST_DEVICEINTERFACE pDevInf=NULL;
switch(message)
{
case WM_INITDIALOG:
HDEVNOTIFY hDevNotify;
DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;
ZeroMemory( &NotificationFilter, sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE;
hDevNotify = RegisterDeviceNotification(hDlg, &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
return TRUE;
case WM_COMMAND:
return TRUE;
case WM_CLOSE:
DestroyWindow(hDlg);
hwndDLG = NULL;
return TRUE;
case WM_DEVICECHANGE:
if ( DBT_DEVICEARRIVAL == wParam
|| DBT_DEVICEREMOVECOMPLETE == wParam
/*|| DBT_DEVNODES_CHANGED == wParam*/)
{
PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam;
// lParam = NULL;
switch( pHdr->dbch_devicetype )
{
case DBT_DEVTYP_DEVICEINTERFACE:
pDevInf = (PDEV_BROADCAST_DEVICEINTERFACE)pHdr;
//UpdateDevice(pDevInf, wParam);//后面根据pDevInf进一步判断,这还要自己实现
break;
}
}
return 0;
break;
}
return FALSE;
}
作者: HoneyZhao 发布时间: 2011-11-14
GetLastError看看错误的原因
作者: happyparrot 发布时间: 2011-11-15
返回错误:0x0000000d 数据无效。
GetLastError() = 0x00000000d;
GetLastError() = 0x00000000d;
作者: HoneyZhao 发布时间: 2011-11-15
我写了很多测试代码。
如何在单Dialog的exe工程中,上面的代码就可以注册成功。
如何在单Dialog的exe工程中,上面的代码就可以注册成功。
作者: HoneyZhao 发布时间: 2011-11-15
有没有做过类似的 赶快发帖呀
作者: HoneyZhao 发布时间: 2011-11-16
你先看看hDlg是不是有效的。
其实DLL中好像不能这么用窗口的,换句话说,DLL不能自己产生窗口,只能提供窗口函数给调用进程来使用,其实就是只能由调用进程来创建窗口。
其实DLL中好像不能这么用窗口的,换句话说,DLL不能自己产生窗口,只能提供窗口函数给调用进程来使用,其实就是只能由调用进程来创建窗口。
作者: Mackz 发布时间: 2011-12-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28