如何在JNA中解析DWORD

时间:2011-05-03 20:48:16

标签: java winapi jna

我正在尝试使用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,与运行相关联的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;

2 个答案:

答案 0 :(得分:1)

结束搞清楚我的问题。无论服务是启动还是停止,都会返回16。事实证明,我没有返回结构SERVICE_STATUS_PROCESS,其定义方式与在本机库中定义的顺序相同。我不知道这需要完成,但你需要按照它们在本机代码中的顺序定义你的结构。

答案 1 :(得分:0)

这样的值通常是许多标志值或者在一起。例如,要指示42标记,您将获得4 | 26。然后,您可以通过将结果(6)与每个标志组合在一起来确定设置了哪些标志,并查看它是否为真(6 & 46 & 2为真,但是{{ 1}}不会,因此您知道标记6 & 14已设置但不是2)。

话虽如此,16将是一个基本值(它是2的幂),所以我不确定。