如何实现LPVOID缓冲区的JNA接口?

时间:2011-02-03 12:45:41

标签: winapi jna

我正在尝试从Windows API实现VerQueryValue的JNA接口。

它具有以下原生签名:

BOOL WINAPI VerQueryValue(
  __in   LPCVOID pBlock,
  __in   LPCTSTR lpSubBlock,
  __out  LPVOID *lplpBuffer,
  __out  PUINT puLen
);

我似乎已经成功转换了三个参数(1 - 指针,2 - WString,4 - IntByReference),但我坚持使用第三个参数。

什么是正确的翻译,以及如何访问存储在该缓冲区中的信息?

1 个答案:

答案 0 :(得分:3)

我倾向于说正确的映射将是:

int VerQueryValue(Pointer pBlock, String lpSubBlock, PointerByReference lplpBuffer, IntByReference puLen);

由于我从未使用过 VerQueryValue ,下面的代码猜测如何使用结果:

//other parameters & method calls ...
//empty constructor : VerQueryValue will valuate the pointed value.
PointerByReference lplpBuffer = new PointerByReference();
//empty constructor : VerQueryValue will valuate the pointed value.
IntByReference puLen = new IntByReference ();
int rc = YourClassName.VerQueryValue(pBlock,lpSubBlock,lplpBuffer,puLen);
//Check rc & co
//use the result
byte[] resBytes = lplpBuffer.getValue().getByteArray(0,puLen.getValue());
//if it's a String
String resString = new String(resBytes, ENCODING);