JNA 映射 Java 字符串到 PCWSTR
JNA map Java String to PCWSTR
SHSTDAPI SHCreateItemFromParsingName(
PCWSTR pszPath,
IBindCtx *pbc,
REFIID riid,
void **ppv
);
我尝试将上面的方法映射到这个方法:
WinNT.HRESULT SHCreateItemFromParsingName(String pszPath, Pointer p, Guid.REFIID riid, PointerByReference ppv);
编辑:
PointerByReference ppv = new PointerByReference();
Guid.REFIID rid = new Guid.REFIID(new Guid.IID(Shell32Extra.IID_IShellItem));
WinNT.HRESULT h = Shell32Extra.INSTANCE.SHCreateItemFromParsingName("*.txt",null,rid,ppv);
IShellItem shellItem = new IShellItem(ppv.getValue());
但是 HRESULT 抛出失败并显示 -2147024894
如果 pbc 不为空,它会抛出内存访问预期
我应该改变什么?我认为它可能由于 PCWSTR 映射而失败。
您的第二个参数应该是指向结构的指针,而不是整数值的地址 (IntByReference
)。如果您不打算使用它,请将其保留为 Pointer
。
在这种情况下,传递 null
应该没问题。
您不需要初始化 PointerByReference
。 JNA 将传递一个内存缓冲区,该缓冲区将由被调用的函数初始化;然后您可以调用 .getValue()
来检索返回的指针值,这将是 IShellItem[2]
.
虽然 technomage 会指出映射错误,但这些错误不会给您带来您得到的结果。 -2147024894的HRESULT
表示系统找不到该文件。您的 dd.txt
文件不在程序有权访问的路径中。
此外,您可以使用 WString
类型来指定您需要一个宽字符串。将您的 dd.txt
(或更长的路径)包装在 WString
构造函数中并传递给它。
SHSTDAPI SHCreateItemFromParsingName(
PCWSTR pszPath,
IBindCtx *pbc,
REFIID riid,
void **ppv
);
我尝试将上面的方法映射到这个方法:
WinNT.HRESULT SHCreateItemFromParsingName(String pszPath, Pointer p, Guid.REFIID riid, PointerByReference ppv);
编辑:
PointerByReference ppv = new PointerByReference();
Guid.REFIID rid = new Guid.REFIID(new Guid.IID(Shell32Extra.IID_IShellItem));
WinNT.HRESULT h = Shell32Extra.INSTANCE.SHCreateItemFromParsingName("*.txt",null,rid,ppv);
IShellItem shellItem = new IShellItem(ppv.getValue());
但是 HRESULT 抛出失败并显示 -2147024894
如果 pbc 不为空,它会抛出内存访问预期
我应该改变什么?我认为它可能由于 PCWSTR 映射而失败。
您的第二个参数应该是指向结构的指针,而不是整数值的地址 (IntByReference
)。如果您不打算使用它,请将其保留为 Pointer
。
在这种情况下,传递 null
应该没问题。
您不需要初始化 PointerByReference
。 JNA 将传递一个内存缓冲区,该缓冲区将由被调用的函数初始化;然后您可以调用 .getValue()
来检索返回的指针值,这将是 IShellItem[2]
.
虽然 technomage 会指出映射错误,但这些错误不会给您带来您得到的结果。 -2147024894的HRESULT
表示系统找不到该文件。您的 dd.txt
文件不在程序有权访问的路径中。
此外,您可以使用 WString
类型来指定您需要一个宽字符串。将您的 dd.txt
(或更长的路径)包装在 WString
构造函数中并传递给它。