Как я могу реализовать интерфейс JNA для буфера LPVOID? - PullRequest
0 голосов
/ 03 февраля 2011

Я пытаюсь реализовать интерфейс JNA для VerQueryValue из Windows API.

Имеет следующую собственную подпись:

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

Я, кажется, успешно преобразовал три параметра (1 - Pointer, 2 - WString, 4 - IntByReference), но я застрял с третьим.

Каков правильный перевод и как я могу получить доступ к информации, хранящейся в этом буфере?

1 Ответ

3 голосов
/ 03 февраля 2011

Я бы сказал, что правильное сопоставление будет:

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);
...