Java 将缓冲区传入/传出到winapi函数的JNA映射
我需要枚举指向Windows Java应用程序中文件的硬链接。我考虑过使用带有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
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
一节十几遍了,但是浏览了另一节。另外,感谢您澄清映射,因为我不确定我在那里需要什么。