+ -
当前位置:首页 → 问答吧 → Win32 DLL 中 RegisterDeviceNotification() 无法注册 没有人回贴呢???????????

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;  
   
  }  

作者: HoneyZhao   发布时间: 2011-11-14

GetLastError看看错误的原因

作者: happyparrot   发布时间: 2011-11-15

返回错误:0x0000000d 数据无效。

GetLastError() = 0x00000000d;

作者: HoneyZhao   发布时间: 2011-11-15

我写了很多测试代码。

如何在单Dialog的exe工程中,上面的代码就可以注册成功。

作者: HoneyZhao   发布时间: 2011-11-15

有没有做过类似的 赶快发帖呀

作者: HoneyZhao   发布时间: 2011-11-16

你先看看hDlg是不是有效的。
其实DLL中好像不能这么用窗口的,换句话说,DLL不能自己产生窗口,只能提供窗口函数给调用进程来使用,其实就是只能由调用进程来创建窗口。

作者: Mackz   发布时间: 2011-12-23

热门下载

更多