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.
Добро пожаловать! Сообщения на этом форуме обычно должны быть ограничены одним конкретным вопросом для каждого сообщения. Лучший подход - объяснить вашу проблему (что вы уже сделали), а затем опубликовать то, что вы пробовали, с конкретным вопросом об этой работе. У вас есть 2 вопроса, но нет примеров того, что вы пробовали ответить на свой первый вопрос.
Спасибо Вам за информацию. Я изменю вопрос.
Я изменил это сейчас.
Кто-нибудь может помочь?
(Windows) PCWSTR - это (C) const wchar_t * (с завершающим нулем), а javadoc говорит, что (как и неконстантная форма) должно быть WString




Ваш второй аргумент должен быть указателем на структуру, а не адресом целочисленного значения (IntByReference). Если вы не собираетесь его использовать, оставьте его как Pointer.
В этом случае прохождение null должно быть нормальным.
Инициализировать PointerByReference не нужно. JNA передаст буфер памяти, который будет инициализирован вызываемой функцией; затем вы можете вызвать .getValue(), чтобы получить возвращаемое значение указателя, которым будет IShellItem[2].
Спасибо. Я изменил метод, как вы можете видеть выше. Но возвращаемое значение по-прежнему равно null, а HRESULT тоже -2147024894.
Хотя technomage указывает на ошибки отображения, они не дадут вам того результата, который вы получили. HRESULT из -2147024894 указывает, что система не может найти файл. Ваш файл dd.txt находится не по пути, к которому программа имеет доступ.
Кроме того, вы можете использовать тип WString, чтобы указать, что вам нужна широкая строка. Оберните ваш dd.txt (или более длинный путь) в конструктор WString и передайте его.
Несколько раз меняю путь к реальным файлам, но ничего не изменилось.
Вам может понадобиться WString: WString dd = new WString("dd.txt");
Теперь выдается новый HRESULT, который говорит: CO_E_NOTINITIALIZED (-2147221008)
Итак, инициализируйте 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); (не забудьте деинициализировать, когда закончите.)
У меня последний вопрос. У меня есть такой метод: HRESULT GetImage (размер SIZE, флаги SIIGBF, HBITMAP * phbm); SIIGBF - это перечисление с int. Какой тип передать в Java (int или IntByReference ...)?
Поскольку подпись - SIIGBF flags, вы напрямую сопоставляете int. Если бы это был *flags, вы бы использовали IntByReference. Исключением из этого правила в JNA являются структуры, которые «автоматически» являются указателями.
Я это уже пробовал. Но это вызывает ожидание доступа. Метод такой docs.microsoft.com/en-us/windows/desktop/api/shobjidl_core/…
Вы используете одно из допустимых целочисленных значений в этой ссылке?
Думаю да (0x00000000)
Не уверен, что смогу еще помочь. Попробуйте задать новый вопрос, относящийся к вашей проблеме.
Я создал новый вопрос. ссылка на сайт
Почему голос против?