Java 将缓冲区传入/传出到winapi函数的JNA映射

Java 将缓冲区传入/传出到winapi函数的JNA映射,java,winapi,jna,Java,Winapi,Jna,我需要枚举指向Windows Java应用程序中文件的硬链接。我考虑过使用带有fsutil硬链接列表的运行时,但需要管理权限。这让我想到了WINAPI(呃)。Kernel32.dll函数,并且应该这样做,但是我在通过JNAAPI调用它时遇到了问题。FindFirstFileNameW具有以下规范: HANDLE WINAPI FindFirstFileNameW( _In_ LPCWSTR lpFileName, _In_ DWORD dwFlags, _Inout_ L

我需要枚举指向Windows Java应用程序中文件的硬链接。我考虑过使用带有
fsutil硬链接列表的运行时,但需要管理权限。这让我想到了WINAPI(呃)。Kernel32.dll函数,并且应该这样做,但是我在通过JNAAPI调用它时遇到了问题。FindFirstFileNameW具有以下规范:

HANDLE WINAPI FindFirstFileNameW(
 _In_     LPCWSTR lpFileName,
 _In_     DWORD dwFlags,
 _Inout_  LPDWORD StringLength,
 _Inout_  PWCHAR LinkName
);
我的JNA映射:

public interface Kernel32 extends StdCallLibrary { 
    Kernel32 INSTANCE = (Kernel32)Native.loadLibrary("kernel32",Kernel32.class, W32APIOptions.UNICODE_OPTIONS);
    HANDLE FindFirstFileNameW(WString wString, int dwFlags, IntByReference StringLength, ______ LinkName);

    boolean FindNextFileNameW(HANDLE hFindStream, IntByReference StringLength, ______ LinkName);
    boolean FindClose(HANDLE hFindFile);
    int GetLastError();
}
调用函数的相关部分:

public String[] getHardLInks(Path path)
{
  Kernel32 lib = Kernel32.INSTANCE;
  IntByReference stringLength = new IntByReference();
  ______ linkName = ______;
  HANDLE hFile = lib.FindFirstFileNameW(new WString(path.toString()), 0, stringLength, linkName);
  String hardlink = //Convert linkName to String
  //Add to array
  // Loop through FindNextFileName
  //Close handle
}
空白处是我尝试将
LinkName
“指向缓冲区的指针,用于存储为
lpFileName
”找到的第一个链接名”映射到许多东西的地方,但都没有成功。其中包括字符串、字符[]、字节[]、缓冲区、指针和内存,但调用不会返回任何内容。我相信从测试中从StringLength得到的返回值来看,其余部分是正确的。但是,
GetLastError
总是返回
ERROR\u MORE\u DATA
(234),根据文档,这意味着缓冲区太小,即使我已经传递了千字节的内存


我应该使用什么数据类型以及如何将其返回到字符串中?

PWCHAR
=>
char[]
,尽管NIO缓冲区或内存也可以工作(请记住缓冲区和内存计数以字节为单位,而API需要以字符为单位)

您还需要将
IntByReference
初始化为数组的大小,否则您会告诉API缓冲区的大小为零,并且它会顺从地用零个字符填充缓冲区

与大多数此类MS API函数一样,您可能可以为缓冲区传递
null
,然后它会将所需的缓冲区大小写入到您的长度引用中

编辑


另一件事-由于您(正确地)使用
W32API\u UNICODE\u选项来初始化库映射,
String
现在将自动映射到宽字符串(因此您不必使用
WString
),并且
-A/W
函数后缀将自动处理,因此,您可以从方法名称中删除
-W
后缀。

如果您尝试了字节缓冲区数组,byte[],那么这个数组有多大?感谢您的响应。我完全忽略了规范中
StringLength
的IN部分。我一定已经读了
LinkName
一节十几遍了,但是浏览了另一节。另外,感谢您澄清映射,因为我不确定我在那里需要什么。