我正在尝试使用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,与running相关的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;
最佳答案
最终弄清楚了我的问题。无论服务是启动还是停止,都将返回16。事实证明,我没有返回的结构SERVICE_STATUS_PROCESS的定义顺序与本机库中定义的顺序相同。我不知道需要这样做,但是您需要按照结构在本机代码中的顺序来定义结构。
关于java - 如何在JNA中解析DWORD,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5875528/