JNA отображает строку Java в 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.

Почему голос против?

Stats 25.08.2018 00:53

Добро пожаловать! Сообщения на этом форуме обычно должны быть ограничены одним конкретным вопросом для каждого сообщения. Лучший подход - объяснить вашу проблему (что вы уже сделали), а затем опубликовать то, что вы пробовали, с конкретным вопросом об этой работе. У вас есть 2 вопроса, но нет примеров того, что вы пробовали ответить на свой первый вопрос.

ehymel 25.08.2018 02:00

Спасибо Вам за информацию. Я изменю вопрос.

Stats 25.08.2018 02:20

Я изменил это сейчас.

Stats 25.08.2018 13:13

Кто-нибудь может помочь?

Stats 25.08.2018 17:45

(Windows) PCWSTR - это (C) const wchar_t * (с завершающим нулем), а javadoc говорит, что (как и неконстантная форма) должно быть WString

dave_thompson_085 26.08.2018 04:03
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Спасибо. Я изменил метод, как вы можете видеть выше. Но возвращаемое значение по-прежнему равно null, а HRESULT тоже -2147024894.

Stats 26.08.2018 02:14
Ответ принят как подходящий

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

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

Несколько раз меняю путь к реальным файлам, но ничего не изменилось.

Stats 26.08.2018 02:16

Вам может понадобиться WString: WString dd = new WString("dd.txt");

Daniel Widdis 26.08.2018 03:18

Теперь выдается новый HRESULT, который говорит: CO_E_NOTINITIALIZED (-2147221008)

Stats 26.08.2018 11:45

Итак, инициализируйте COM! :) hres = Ole32.INSTANCE.CoInitializeEx(null, Ole32.COINIT_MULTITHREADED); и hres = Ole32.INSTANCE.CoInitializeSecurity(null, -1, null, null, Ole32.RPC_C_AUTHN_LEVEL_DEFAULT, Ole32.RPC_C_IMP_LEVEL_IMPERSONATE, null, Ole32.EOAC_NONE, null); (не забудьте деинициализировать, когда закончите.)

Daniel Widdis 26.08.2018 17:48

У меня последний вопрос. У меня есть такой метод: HRESULT GetImage (размер SIZE, флаги SIIGBF, HBITMAP * phbm); SIIGBF - это перечисление с int. Какой тип передать в Java (int или IntByReference ...)?

Stats 26.08.2018 18:33

Поскольку подпись - SIIGBF flags, вы напрямую сопоставляете int. Если бы это был *flags, вы бы использовали IntByReference. Исключением из этого правила в JNA являются структуры, которые «автоматически» являются указателями.

Daniel Widdis 26.08.2018 21:53

Я это уже пробовал. Но это вызывает ожидание доступа. Метод такой docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/…

Stats 26.08.2018 22:31

Вы используете одно из допустимых целочисленных значений в этой ссылке?

Daniel Widdis 26.08.2018 23:46

Думаю да (0x00000000)

Stats 27.08.2018 04:58

Не уверен, что смогу еще помочь. Попробуйте задать новый вопрос, относящийся к вашей проблеме.

Daniel Widdis 27.08.2018 06:43

Я создал новый вопрос. ссылка на сайт

Stats 16.09.2018 14:02

Другие вопросы по теме