我正在尝试使用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相关的DWORD0x00000004,因此在我的代码中,我定义了一个最终的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/

10-12 18:39