Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск потока от имени пользователя / 9 сообщений из 9, страница 1 из 1
21.07.2015, 11:18
    #39012014
mytoffnax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
Доброго времени суток!
Собственно, даже не знаю возможно ли это...
С помощью jna инициализирую dll и получаю объект. При повторной инициализации вываливается системная ошибка.
1. Как мне можно использовать этот объект в разных потоках?

2. Возможно ли в каждом новом потоке инициализировать новый объект от имени пользователя винды (runas)?
Т.е. первый поток от пользователя 1, второй от пользователя 2 и т.д.

Командная строка в этом случае не подходит (вроде), так как нужно передавать объекту (не dll) нужные параметры после инициализации
Заранее спасибо
...
Рейтинг: 0 / 0
21.07.2015, 11:25
    #39012030
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
mytoffnaxС помощью jna инициализирую dll и получаю объект. При повторной инициализации вываливается системная ошибка.
1. Как мне можно использовать этот объект в разных потоках?

Сама DLL загружается в JVM лишь единожды. Поэтому достаточно исключить множественную загрузку DLL.
А вот многопоточное использование сильно зависит от самой DLL. Тонны legacy софта написаны с глобальными переменными и ни о какой многопоточности речи быть не может. Единственным решением будет обертка каждого запуска в отдельный процесс. Под виндой это может оказаться достаточно накладно.

mytoffnax2. Возможно ли в каждом новом потоке инициализировать новый объект от имени пользователя винды (runas)?
Т.е. первый поток от пользователя 1, второй от пользователя 2 и т.д.

Это вопрос к винде, а не к Java. AFAIK, процессы запускаются от имени пользователя. Потоки - нет.

mytoffnaxКомандная строка в этом случае не подходит (вроде), так как нужно передавать объекту (не dll) нужные параметры после инициализации
Вы не теми понятиями оперируете. "Командная строка" и "отдельный процесс" это не совсем одно и то же. Да и с параметрами можно что-то придумать. Вопрос только в том решит ли это все проблемы.
...
Рейтинг: 0 / 0
21.07.2015, 13:12
    #39012211
scf
scf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
Ага. загруженная dll - одна на процесс и может (и должна) быть проинициализирована только один раз. Использовать в разных потоках легко - просто вызываешь методы этой длл из разных потоках, используя единственный объект JNA (его не зря рекомендуют делать static).

Если сама длл не предназначена для работы в нескольких потоках параллельно, то придется тебе создавать отдельный JVM-процесс под каждый поток, который тебе нужен.
...
Рейтинг: 0 / 0
21.07.2015, 13:16
    #39012219
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
scfЕсли сама длл не предназначена для работы в нескольких потоках параллельно, то придется тебе создавать отдельный JVM-процесс под каждый поток, который тебе нужен.
Та, ну нафиг. Зачем обязательно JVM? Можно любой нативный, лишь бы только найти способ с ним общаться.
...
Рейтинг: 0 / 0
21.07.2015, 13:45
    #39012277
mytoffnax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
Спасибо за помощь!
Классы работающие с dll решил обернуть в отдельный jar и вызывать отдельными процессами.

Это нормальный выход или всё таки это кривой костыль?
...
Рейтинг: 0 / 0
21.07.2015, 14:09
    #39012321
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
mytoffnaxСпасибо за помощь!
Классы работающие с dll решил обернуть в отдельный jar и вызывать отдельными процессами.
Это нормальный выход или всё таки это кривой костыль?
1) Зависит о самой DLL. Это кривой костыль, но, зачастую, это единственный выход.
2) Стоит учесть что запускать каждый раз новую DLL может быть накладно. Более производительным решением может быть небольшой нативный менеджер, который бы через I/O процесса общался бы с Java.
...
Рейтинг: 0 / 0
21.07.2015, 15:56
    #39012461
mytoffnax
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
Обернул в Jar, запустил в отдельном процессе - всё работает, результат верный, но есть один момент
После отработки DLL выдаёт ошибку "Инструкция с таким то адресом попыталась обратиться к такому то адресу. Память не может быть read"
и соответственно процессы жду, когда пользователь нажмёт кнопочку "ОК"

Вызов самого Jar
Код: java
1.
2.
		Process process = Runtime.getRuntime().exec("java -jar C:\\test.jar trololo");
		process.waitFor();



Эта ошибка выскакивает в process.waitFor() (так понимаю, выполнение процесса), можно ли с этим что то сделать, не прибегая к правке DLL?

Суть работы jar
1.Инициализация DLL
2.Выполнение её (создаёт файлы)
3.Копирование созданных файлов

Может быть можно как то грохнуть объект DLL после шага 2?
...
Рейтинг: 0 / 0
21.07.2015, 16:43
    #39012537
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
mytoffnax....всё работает...DLL выдаёт ошибку "Инструкция с таким то адресом попыталась обратиться к такому то адресу. Память не может быть read"...

У меня когнетивный диссонанс. Так работает или DLL вызывает GPF ? )))

По хорошему - исправлять ошибку
mytoffnax...Может быть можно как то грохнуть объект DLL после шага 2?...
Нет такого "объект DLL". А вот процесс грохнуть можно.

Только, хорошо бы. не грохать, а найти ошибку (что ее вызывает) и исправить.
...
Рейтинг: 0 / 0
29.07.2015, 12:15
    #39018493
AlexBoyz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запуск потока от имени пользователя
стандартная ошибка
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Запуск потока от имени пользователя / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]