我正在尝试使用JNA在Java中查询Windows服务的状态。我正在使用以下Windows API函数:
QuerySerivceStatusEx( SC_HANDLE hService, SC_STATUS_TYPE InfoLevel, LPBYTE lpBuffer, DWORD cbBufSize, LPDWORD pcbBytesNeeded)
LPBYTE lpBuffer
内部是指向结构的指针。在结构内部,它将当前状态存储为DWORD
。根据JNA文档DWORDs
映射到Java中的ints
,并且根据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;
答案 0 :(得分:1)
结束搞清楚我的问题。无论服务是启动还是停止,都会返回16。事实证明,我没有返回结构SERVICE_STATUS_PROCESS,其定义方式与在本机库中定义的顺序相同。我不知道这需要完成,但你需要按照它们在本机代码中的顺序定义你的结构。
答案 1 :(得分:0)
这样的值通常是许多标志值或者在一起。例如,要指示4
和2
标记,您将获得4 | 2
或6
。然后,您可以通过将结果(6
)与每个标志组合在一起来确定设置了哪些标志,并查看它是否为真(6 & 4
或6 & 2
为真,但是{{ 1}}不会,因此您知道标记6 & 1
和4
已设置但不是2
)。
话虽如此,16将是一个基本值(它是2的幂),所以我不确定。