#java #winapi #jna
#java #winapi #jna
Вопрос:
Я пытаюсь запросить статус службы Windows на Java, используя JNA. Я использую следующую функцию Windows API:
QuerySerivceStatusEx( SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded)
Внутри LPBYTE lpBuffer
находится указатель на структуру. И внутри структуры он сохраняет текущее состояние как DWORD
. Согласно документации JNA, DWORDs
map into 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;
Ответ №1:
В итоге я решил свою проблему. возвращалось 16 независимо от того, была ли запущена служба или остановлена. Как оказалось, у меня не было возвращаемой структуры, SERVICE_STATUS_PROCESS, определенной в том же порядке, в котором она определена в собственной библиотеке. Я не знал, что это необходимо сделать, но вам нужно определить свои структуры в том же порядке, в котором они находятся в машинном коде.
Ответ №2:
Подобные значения часто представляют собой множество значений флага или, объединенных вместе. например, чтобы указать как 4
, так и 2
флаг, вы получите 4 | 2
или 6
. Затем вы могли бы выяснить, какие флаги установлены, сопоставив результат ( 6
) с каждым из флагов и посмотрев, верно ли это ( 6 amp; 4
или 6 amp; 2
было бы верно, но 6 amp; 1
не было бы, так что вы знаете, что флаги 4
и 2
установлены, но не 1
).).
При этом 16 будет базовым значением (это степень 2), поэтому я не уверен.
Комментарии:
1. Я не думаю, что это имеет значение, поскольку в данном случае. Значения для состояний равны 1,2,3,4,5,6,7, что не помогло бы этой работе. Я отредактирую вопрос, чтобы уточнить
2. какая структура возвращается? можете ли вы дать ссылку на документы winapi?