Windows api with java

Содержание
  1. Windows « API « Java I/O Q&A
  2. 1. How to write into input stream in java stackoverflow.com
  3. 2. Play video in java from InputStream stackoverflow.com
  4. 3. Reading EUC encoded HTML using Java on Windows stackoverflow.com
  5. 4. Piping data through an external application on Windows using Java stackoverflow.com
  6. 5. instance of external program inside a buffer stackoverflow.com
  7. 6. FileChannel.transferTo for large file in windows stackoverflow.com
  8. 7. Java 7 nio WatchService slow to respond in windows 7 stackoverflow.com
  9. 8. Double linebreak with BufferedReader on Win XP, but not other OSs. same code stackoverflow.com
  10. 9. Trouble writing to process stream on Windows coderanch.com
  11. 10. File.lastModified() on windows vs linux coderanch.com
  12. 11. Creating a PrintWriter object in Windows. coderanch.com
  13. 12. File.createTempFile() throws exception on Win7 coderanch.com
  14. 13. File.createTempFile() throws exception on Win7 java-forums.org
  15. 14. Opeing multiple pdf files in different acrobat reader windows java-forums.org
  16. 15. rtp video streaming issue from linux to windows forums.oracle.com
  17. 16. File lastModified — different results from unix / windows forums.oracle.com
  18. 17. Pb using BufferedReader Linux OK, Windows nOK forums.oracle.com
  19. 18. java.nio, FileChannel Reading — Differences in Windows and Linux forums.oracle.com
  20. Существует ли библиотека Java для доступа к собственному Windows API?
  21. 6 ответов
  22. Создание Windows службы на Java
  23. Введение
  24. Создание минимизированной версии JRE
  25. Создание Windows службы из любого приложения
  26. WinSW
  27. Взаимодействие Java и Windows API
  28. Работа с процессами
  29. Взаимодействие с другими компонентами системы
  30. WebSocket
  31. HTTP-клиент
  32. Заключение

Windows « API « Java I/O Q&A

1. How to write into input stream in java stackoverflow.com

Suppose i execute a command in java using the exec() function and i store the reference in a Process . How do i write into the input stream of that process

2. Play video in java from InputStream stackoverflow.com

Does anyone know what I should use to play a video in Java, from an InputStream? I get the video from a SOAP message, and I don’t want to save it to .

3. Reading EUC encoded HTML using Java on Windows stackoverflow.com

I am trying to read an HTML file which is encoded in EUC-KR from a URL. When I compile the code inside the IDE I get the desired output, but when .

4. Piping data through an external application on Windows using Java stackoverflow.com

I have a Java-app with an InputStream, which is copying data to an OutputStream. I want to compress the data from the InputStream using FreeArc, before writing it to the OutputStream. .

5. instance of external program inside a buffer stackoverflow.com

i have a project that involve the streaming of the image of a running program. the program can be anything, a video player, a stock control, with any type of visual stuff .

6. FileChannel.transferTo for large file in windows stackoverflow.com

Using Java NIO use can copy file faster. I found two kind of method mainly over internet to do this job.

public static void copyFile(File sourceFile, File destinationFile) throws IOException < .

7. Java 7 nio WatchService slow to respond in windows 7 stackoverflow.com

I have created a tailing program to watch a log file that is frequently updated. I wanted to use the new NIO stuff in Java seven to wait for the .

8. Double linebreak with BufferedReader on Win XP, but not other OSs. same code stackoverflow.com

I have some code that does a Runtime exec and parses the results. On linux and Windows7, the code works fine for parsing the system commands, but on Win XP .

9. Trouble writing to process stream on Windows coderanch.com

I have an external app I need to drive by sticking data in its stdin — I create the process and grab the streams accordingly (see below). On unix, this works fine, but on Windows I’m getting java.lang.IOException: The pipe is being closed as soon as I try to write a second batch of data to it (I don’t close the .

10. File.lastModified() on windows vs linux coderanch.com

File.lastModified() javadoc says — A long value representing the time the file was last modified, measured in milliseconds since the epoch (00:00:00 GMT, January 1, 1970), or 0L if the file does not exist or if an I/O error occurs But this method is rounding off the value on the Linux, to its nearest second unlike windows. (for example if a .

Читайте также:  Rdp ������ ��� mac os

11. Creating a PrintWriter object in Windows. coderanch.com

[Susan]: The first approach below is okay but not the second one. What exactly is wrong with the second? Does it throw an exception? If so, what’s the error message? Or does somethign else go wrong? [Susan]: No, but that’s what I’m actually wondering. If I don «12345.xml» it will create the file if it doesn’t exist. Why not in this .

12. File.createTempFile() throws exception on Win7 coderanch.com

When i call File.createTempFile() on a Win7 system it throws the following exception. This happens when i run my application as a windows service. If i run the application just as a simple java application then it works fine. java.io.IOException: The system cannot find the path specified at java.io.WinNTFileSystem.createFileExclusively(Nati ve Method) at java.io.File.checkAndCreate(Unknown Source) at java.io.File.createTempFile(Unknown Source) at java.io.File.createTempFile(Unknown Source) at .

13. File.createTempFile() throws exception on Win7 java-forums.org

When i call File.createTempFile() on a Win7 system it throws the following exception. This happens when i run my application as a windows service. If i run the application just as a simple java application then it works fine. java.io.IOException: The system cannot find the path specified at java.io.WinNTFileSystem.createFileExclusively(Nati ve Method) at java.io.File.checkAndCreate(Unknown Source) at java.io.File.createTempFile(Unknown Source) at java.io.File.createTempFile(Unknown Source) at .

14. Opeing multiple pdf files in different acrobat reader windows java-forums.org

By clicking a submit button i’m calling a javascript in a jsp which uses «window.open» function and opens a jsp. In this jsp i call a function for opening a pdf file using «document.location.href». in this i have specified the URL to open this pdf. Now i want that if after this pdf is opened, i again chose some option and .

15. rtp video streaming issue from linux to windows forums.oracle.com

i am currently running a windows machine and linux machine on the same network connected by a linksy wrt45g router. i am trying to use avtransmit2.java and avreceive2.java to stream a video from one computer to the other and i can’t get it to go from either win to linux or linux to win. i am able to send information from .

16. File lastModified — different results from unix / windows forums.oracle.com

Hi all, I’ve a simple file poller that listens for files created in a specific folder. I noticed different results when the producer creates files within the same second and I run the poller under windows or under unix (I tried under solaris & under AIX). To test this scenario I wrote a simple FileProducer that creates files and lists the .

17. Pb using BufferedReader Linux OK, Windows nOK forums.oracle.com

Thank you for your reply. In fact the code inside the read loop create an object DicEntry that has three members each members receiving a part of the read line. It seems not to create problem as the program always return from its constructors with a valid value. But what is interesting is the following: If instead of creating DicEntries and .

18. java.nio, FileChannel Reading — Differences in Windows and Linux forums.oracle.com

For 1 & 2. this is just a sample, i’m not «worried» about those sizes yet. I am looking at this in debug. #3 doesn’t solve the problem. NIO provides us with the speed and a few other things that we are looking for. We actually went through and explicity re-saved the file in Linux as UTF-8 and it worked on .

Существует ли библиотека Java для доступа к собственному Windows API?

Существует ли библиотека Java для доступа к собственному API Windows? Либо с COM или JNI.

6 ответов

Вы могли бы попробовать эти два, я видел успех с обоими.

Проект интеграции Java /Win32 (Jawin) является бесплатным, открытым исходным кодом архитектура для взаимодействия между Java и выставленными компонентами через компонентный объект Microsoft Модель (COM) или через Win32 Dynamic Библиотеки ссылок (DLL).

JNA обеспечивает легкий доступ к Java-программам в собственные разделяемые библиотеки (библиотеки DLL на Винда) ничего не написав но Java-код — нет JNI или нативный код требуется. Эта функциональность сравнимо с платформой Windows Invoke и типы Python. Доступ динамический во время выполнения без генерации кода.

Читайте также:  Что надо сделать чтобы ноутбук работал быстрее windows 10

JNA позволяет звонить прямо в нативные функции, использующие естественную Java вызов метода. Вызов Java выглядит так же, как это происходит в нативном коде. Наиболее звонки не требуют специальной обработки или конфигурации; нет образца или требуется сгенерированный код.

Также читайте здесь:

Собственный интерфейс Java (JNI) — это среда программирования, которая позволяет Java код работает на виртуальной машине Java (JVM) позвонить и позвонить 1 нативные приложения (программы специфичные к оборудованию и операционной системе платформа) и библиотеки, написанные на другие языки, такие как C, C ++ и сборка.

Собственный доступ к Java обеспечивает Java программы легкий доступ к родным общим библиотеки без использования Java Родной интерфейс. Дизайн JNA направлен на обеспечить естественный доступ естественным образом с минимумом усилий. нет шаблон или сгенерированный код клея требуется.

JNA довольно хорош Я просто новичок, и мне было очень легко. Работает не только для Win32 API, но и для почти любой другой DLL.

Jacob неплохо работает на стороне COM (но это настоящий COM — как вы пишете на C ++ — если вы знакомы с истинным программированием на COM, то использовать Джейкоба несложно)

Еще один вариант — WinRun4J . Он имеет собственный уровень привязки, который стремится быть совместимым с pinvoke.net (собственный формат привязки, используемый в точечной сети). См. примеры для получения дополнительной информации. Это немного ранних дней, так что YMMV.

(полное раскрытие: я работаю над проектом).

Еще один вариант — JFFI — он используется в jruby и jython для взаимодействия с нативными библиотеками.

Создание Windows службы на Java

February 22, 2019 Jazz Team Технические статьи

Введение

В рамках одного из проектов требовалось разработать Windows службу, которая могла бы выполнять ряд действий с помощью Windows API, Websocket и стандартных средств Java. Далее в статье будут описаны шаги, которые были сделаны для создания такой службы.
Потребность в Windows службе возникла из-за необходимости иметь программу со следующими возможностями:

  • она должна быть постоянно запущена,
  • выполнялась от системного пользователя,
  • автоматически запускалась при старте системы,
  • чтобы её сложно было остановить обычному пользователю.

Создание минимизированной версии JRE

Так как GraalVM всё ещё не поддерживает создание исполняемых файлов под Windows, было решено воспользоваться другими возможностями, которые предоставляет экосистема Java, а именно создание минимизированной версии JRE.

Для того, чтобы создать минимизированную версию JRE, для начала необходимо узнать зависимости на определенные пакеты, которые будут включены в JRE.

В первую очередь необходимо собрать jar-файл “fat jar” со всеми зависимостями.

Затем выполнить команду jdeps -s , чтобы получить список всех зависимостей. Например:

Далее создаём нашу версию JRE с данными зависимостями:

jlink –module-path –add-modules

java.base,java.datatransfer,java.desktop,java.logging,java.net.http,java.sql,java.xml,jdk.unsupported –strip-debug –compress 2 –no-header-files –no-man-pages –output

Обратите внимание, что перечисление пакетов для опции –add-modules необходимо разделять запятой и не ставить между ними пробелов. Остальные опции отвечают за сжатие и убирание файлов и другой информации, которая не пригодится для выполнения программы.

После выполнения этих действий JRE будет занимать порядка 30 mb, вместо сотен.

Создание Windows службы из любого приложения

Java не имеет стандартных средств по созданию служб, поэтому были изучены сторонние инструменты и был выбран WinSW в силу его бесплатности и простоты использования.

WinSW

WinSW – это утилита, которая позволяет запустить и обернуть любой процесс как Windows службу. Для того, чтобы начать с ней работать, необходимо скачать исполняемый и конфигурационный файлы по этой ссылке https://github.com/kohsuke/winsw/releases.

Необходимо поместить эти два файла в директорию. Переименовать исполняемый файл на своё усмотрение и дать такое же название файлу конфигурации, затем поместить в эту директорию jar-файл приложения и созданную JRE.

В конфигурационном файле необходимо прописать минимальную конфигурацию:

jre\bin\java.exe – относительный путь внутри нашей папки к исполняемому файлу нашей JRE.

После этих действий можно установить службу, для этого необходимо выполнить команду от имени администратора:

Список команд можно посмотреть здесь .

Взаимодействие Java и Windows API

Для использования функций Windows (таких как создание нового процесса или добавление ключей реестра) в нашем приложении был использован JNA.
JNA (Java Native Access) предоставляет Java-программам легкий доступ к библиотекам, написанным на другом языке, без написания чего-либо, кроме кода Java. JNA позволяет напрямую вызывать нативные функции, используя обычный вызов метода Java. Большинство методов не требуют специальной обработки или конфигурации; не требуется шаблон или сгенерированный код.
Подключить и работать с JNA очень просто, для этого необходимо скачать jar-файл или подключить зависимость в сборщик проекта – в нашем случает Maven:

В нашем проекте мы использовали JNA для достижения следующих целей: заблокировать и сделать вновь доступным диспетчер задач 1) по комбинации Ctrl+Shift+Esc и 2) в меню, доступном по комбинации Ctrl+Alt+Del.

Читайте также:  Программируемый контроллер с linux

Для достижения этого были использованы класс Advapi32Util (удобная обёртка над библиотекой advapi32.dll) и интерфейс WinReg с полезными константами , которые предоставляют функциональность для внесения изменений в реестр Windows (Рисунок 1. Класс TaskManager с методами enable() и disable() для изменения ключей реестра диспетчера задач).

Рисунок 1. Класс TaskManager с методами enable() и disable() для изменения ключей реестра диспетчера задач.

  • Создать новый процесс от имени определённого пользователя Windows. Для этого мы использовали метод CreateProcessAsUser()интерфейса Advapi32. В метод необходимо передать следующие параметры:
    • hToken – дескриптор токена пользователя, для которого мы запускаем процесс.
    • lpApplicationName – имя модуля, который должен быть выполнен.
    • lpCommandLine – командная строка для выполнения.
    • lpProcessAttributes – указатель на структуру SECURITY_ATTRIBUTES, которая определяет дескриптор безопасности для нового объекта процесса и определяет, могут ли дочерние процессы наследовать возвращенный дескриптор процесса.
    • lpThreadAttributes – указатель на структуру SECURITY_ATTRIBUTES, который определяет дескриптор безопасности для нового объекта потока и определяет, могут ли дочерние процессы наследовать возвращенный дескриптор потока.Создать новый процесс от имени определённого пользователя Windows. Для этого мы использовали метод CreateProcessAsUser() интерфейса Advapi32. В метод необходимо передать следующие параметры:
    • bInheritHandles – если этот параметр TRUE, каждый наследуемый дескриптор вызывающего процесса наследуется новым процессом. Если параметр FALSE, процессы не наследуются.
    • dwCreationFlags – флаги, которые контролируют класс приоритета и создают процесс.
    • lpEnvironment – указатель на блок среды для нового процесса. Если этот параметр равен NULL, новый процесс использует среду вызывающего процесса. Блок среды состоит из блока с нулевым завершением строк с нулевым завершением. Каждая строка имеет следующий вид: name = value \ 0.
    • lpCurrentDirectory – полный путь к текущему каталогу для процесса. Строка также может указывать путь UNC (universal naming convention).
    • lpStartupInfo – указатель на структуру STARTUPINFO или STARTUPINFOEX.lpProcessInformation – указатель на структуру PROCESS_INFORMATION, которая получает идентификационную информацию о новом процессе.

Рисунок 2. Метод для создания нового процесса для определённого пользователя Windows.

  • Получить токен активного пользователя, т.к. он необходим для создания процесса от определённого пользователя.

Работа с процессами

Для работы и слежения за процессами в Windows был использован, добавленный в Java 9, класс ProcessHandle. ProcessHandle позволяет получать и производить различные манипуляции с процессами. В частности, при решении задачи, требовалось собирать PID процессов, фильтровать процессы на основе имени и принудительно завершать необходимые процессы.

Рисунок 3. Класс ProcessHandler с методами takeSnapshot() для создания снимка текущих процессов и closeNewProcesses() для завершения процессов, отличных от снимка.

Взаимодействие с другими компонентами системы

WebSocket

Для Java существует стандартизированный API для работы с WebSocket.

Но одного API недостаточно, поэтому для запуска кода была выбрана одна из его реализаций – Tyrus.

Далее можно создать минималистичный сервер и указать обработчики (EndPoints).

Заготовка обработчика выглядит следующим образом:

HTTP-клиент

С выпуском 11-ой версии Java в ней появился удобный HTTP-клиент, поэтому потребность в сторонних клиентах исчезла.

Для создания экземпляра клиента необходимо воспользоваться билдером. В простейшем случае:

Далее необходимо создать запрос(request), например:

Затем этот запрос можно использовать для отправки на сервер:

Заключение

Благодаря модульной организации версий Java 9 и выше, утилите WinSW, обновлённому Process API для взаимодействия с процессами операционной системы и библиотеки JNA (Java Native Access), которая предоставляет программам Java простой доступ к нативным библиотекам, мы смогли создать Windows службу с использованием языка Java, на котором была реализована и серверная часть. Что в итоге позволило не вводить в процесс разработки новый язык.

Оцените статью