JNA сопоставляет строку Java с PCWSTR - PullRequest
0 голосов
/ 25 августа 2018
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 голосов
/ 26 августа 2018

Несмотря на то, что техномаг указывает на ошибки отображения, они не дадут вам того результата, который вы получили.HRESULT -2147024894 указывает, что система не может найти файл.Ваш файл dd.txt не находится по пути, к которому у программы есть доступ.

Кроме того, вы можете использовать тип WString, чтобы указать, что вам нужна широкая строка.Оберните ваш dd.txt (или более длинный путь) в конструкторе WString и передайте его.

0 голосов
/ 26 августа 2018

Ваш второй аргумент должен быть указателем на структуру, а не адресом целочисленного значения (IntByReference).Если вы не собираетесь его использовать, оставьте его как Pointer.В этом случае передача null должна быть в порядке.

Вам не нужно инициализировать PointerByReference.JNA передаст буфер памяти, который будет инициализирован вызываемой функцией;затем вы можете вызвать .getValue(), чтобы получить возвращенное значение указателя, которое будет IShellItem[2].

...