Как разобрать DWORD в JNA - PullRequest
2 голосов
/ 04 мая 2011

Я пытаюсь запросить статус службы Windows в Java с помощью JNA. Я использую следующую функцию Windows API:

QuerySerivceStatusEx( SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded)

Внутри LPBYTE lpBuffer находится указатель на структуру. А внутри структуры он хранит текущее состояние как DWORD. Согласно документации JNA DWORDs отображается в ints в Java, а согласно WinSvc.h DWORD, связанный с выполнением, равен 0x00000004, поэтому в моем коде я определил конечное значение int со значением 0x00000004, например

public static final int SERVICE_RUNNING = 0x00000004

Когда я запускаю код и запускаю запрашиваемую службу, я получаю значение 16, которое вообще не определено в WinSvc.h. Я пропускаю какой-то перевод?

РЕДАКТИРОВАТЬ: Чтобы уточнить, все состояния, в которых может быть служба, и связанные с ними значения:

   public static final int SERVICE_STOPPED            = 0x00000001;
   public static final int SERVICE_START_PENDING      = 0x00000002;
   public static final int SERVICE_STOP_PENDING       = 0x00000003;
   public static final int SERVICE_RUNNING            = 0x00000004;
   public static final int SERVICE_CONTINUE_PENDING   = 0x00000005;
   public static final int SERVICE_PAUSE_PENDING      = 0x00000006;
   public static final int SERVICE_PAUSED             = 0x00000007;

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Закончилось выяснение моей проблемы.16 возвращается независимо от того, была ли служба запущена или остановлена.Оказывается, у меня не было возвращаемой структуры, SERVICE_STATUS_PROCESS , определенной в том же порядке, в котором она определена в собственной библиотеке.Я не знал, что это необходимо сделать, но вам нужно определить ваши структуры в том же порядке, в котором они находятся в собственном коде.

0 голосов
/ 04 мая 2011

Такие значения часто являются многими значениями флагов или объединены.например, чтобы указать оба флага 4 и 2, вы получите 4 | 2 или 6.Затем вы можете выяснить, какие флаги установлены, сложив результат (6) с каждым из флагов и посмотрев, является ли он истинным (6 & 4 или 6 & 2 будет истинно, но 6 & 1 не будет, поэтомуВы знаете, что флаги 4 и 2 установлены, но не 1).

При этом 16 будет основным значением (это степень 2), поэтому я не уверен.

...