JNA将Java字符串映射到PCWSTR

时间:2018-08-24 22:43:45

标签: java c shell jna

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不为null,则会抛出内存访问期望

我应该改变什么?我认为它可能由于PCWSTR映射而失败。

2 个答案:

答案 0 :(得分:0)

第二个参数应该是指向struct的指针,而不是整数值(IntByReference)的地址。如果您不打算使用它,请将其保留为Pointer。 在这种情况下,可以通过null

您不需要初始化PointerByReference。 JNA将传递一个内存缓冲区,该内存缓冲区将由调用的函数初始化;然后,您可以调用.getValue()来获取返回的指针值,即IShellItem[2]

答案 1 :(得分:0)

尽管技术指出了映射错误,但这些错误不会给您带来的结果。 -2147024894的HRESULT表示系统找不到文件。您的dd.txt文件不在程序有权访问的路径中。

此外,您可以使用WString类型来指定您需要一个宽字符串。将您的dd.txt(或更长的路径)包装在WString构造函数中并传递它。