2012-05-10 10 views
0

USBスレーブアプリケーションから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の宣言は以下のとおりです。

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

私は常にすべてのヘルプをいただければ幸いエラー1066を受け付けております。より多くの情報が必要な場合は、私に知らせて、それを含めることができます。

答えて

0

Longを返すようにRegisterDeviceNotificationを宣言すると問題が発生していました。 JNAのFAQによると、JNA FAQ

実際には、誰もこの質問をしていないが、彼らは本当に 答えを必要とします。 Javaを長く使わないでください!

Windowsでは、ネイティブlong型は 常に32ビットであるため、Java intを使用できます。他のプラットフォームでは、タイプは32ビットまたは64ビットの であるため、NativeLongタイプを使用して、適切なサイズが であることを確認する必要があります。

関連する問題