2012-05-10 2 views
0

Java 스윙 응용 프로그램에서 USB 장치 도착 및 장치 제거 완료 이벤트에 대한 알림을 등록하려고합니다.JNA 호출 RegisterDeviceNotification이 오류 1066으로 실패 함

나는 성공적으로 리스너를 등록 할

SetWindowLong(hWnd, MyUser32.GWLP_WNDPROC, listener); 

라고하고 난 형 WM_DEVICECHANGE의 통지를 받고 있습니다. 여태까지는 그런대로 잘됐다.

이제 RegisterDeviceNotification을 호출하여 장치 도착을 알리고 완료 이벤트를 제거하려고합니다. 여기에 내가 시도 것입니다 :

HWND hWnd = new HWND(); 
hWnd.setPointer(Native.getWindowPointer(frame)); 
DEV_BROADCAST_DEVICEINTERFACE filter = new DEV_BROADCAST_DEVICEINTERFACE(); 
filter.dbcc_classguid = GUID_DEVINTERFACE_USB_DEVICE;  
filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; 
filter.dbcc_name = new char[1]; 
filter.dbcc_reserved = new DWORD(0); 
filter.dbcc_size = new DWORD(filter.size()); 
filter.dbcc_size = new DWORD(filter.size()); 

long retVal = MyUser32.MYINSTANCE.RegisterDeviceNotification(new HANDLE(hWnd.getPointer()), filter.getPointer(), DEVICE_NOTIFY_WINDOW_HANDLE); 

if (retVal != 0) { 
    System.out.println("Error registering for usb: " + Native.getLastError()); 
} 

내 JNA 선언은 다음과 같습니다 : 난 항상 오류 1066 어떤 도움을 주시면 감사하겠습니다을 수신하고

public long RegisterDeviceNotification(HANDLE hRecipient, Pointer NotificationFilter, DWORD Flags); 

public static class DEV_BROADCAST_DEVICEINTERFACE extends Structure { 
     public DWORD dbcc_size; 
     public DWORD dbcc_devicetype; 
     public DWORD dbcc_reserved; 
     public GUID dbcc_classguid; 
     public char[] dbcc_name; 
} 

public static final GUID GUID_DEVINTERFACE_USB_DEVICE = new GUID(new byte[] { 
     (byte)0xA5, (byte)0xDC, (byte)0xBF, 0x10, 0x65, 0x30, 0x11, (byte)0xD2, (byte)0x90, 0x1F, 0x00, (byte)0xC0, 0x4F, (byte)0xB9, 0x51, (byte)0xED   
}); 

. 더 많은 정보가 필요하다면 알려주십시오.

답변

0

RegisterDeviceNotification을 long으로 반환하도록 선언하면 문제가 발생합니다. JNA FAQ에 따르면, JNA FAQ

사실, 아무도이 질문을하지 않습니다,하지만 그들은 정말 답을해야합니다. Java를 오래 사용하지 마십시오!

Windows에서 기본 네이티브 형식은 항상 이고 32 비트이므로 Java int를 사용할 수 있습니다. 다른 플랫폼에서는 유형이 32 또는 64 비트 인 일 수 있으므로 적절한 크기가 이되도록 NativeLong 유형을 사용해야합니다.