2. C/C++ код приложения process_manager.exe, который умеет вызывать команды через system (), например
int r_1 = system ("echo 123 > c:\\temp\\123.dat");
int r_2 = system ("c:\\temp\\some_script.cmd");
3. и CMD код some_script.cmd :
echo 456 > c:\\temp\\456.dat
Как работает:
11. Если запустить process_manager.exe руками в консоли, то создаются и 123.dat и 456.dat
Как не работает:
22. Если запустить process_manager.exe через ru.java.process.manager.jar, то создается 123.dat, НО НЕ СОЗДАЕТСЯ 456.dat
22.1 int r_2 = system ("c:\\temp\\some_script.cmd"); возвращает в этом случае код "1".
Вопрос:
33. Как заставить работать вызов system ("c:\\temp\\some_script.cmd") при спауне процесса process_manager.exe из под java машины ?
package ru.java.process.manager;
public class MainClass {
public static void main(String[] args) {
try {
//
Runtime.getRuntime().exec("c:\\temp\\process_manager.exe");
//
} catch (Exception e) {
e.printStackTrace();
}
}
}
66. process_manager.exe
#include <cstdlib>
/**
*
*/int main(int argc, char **argv) {
//это работает и при запуске process_manager.exe руками из консоли
//и при запуске process_manager.exe через java ru.java.process.managerint r_1 = system ("echo 123 > c:\\temp\\123.dat");
//а вот это работает при запуске process_manager.exe руками из консоли
//но НЕ работает при запуске process_manager.exe через java ru.java.process.managerint r_2 = system ("c:\\temp\\some_script.cmd");
}
#include <cstdlib>
#include <fstream>
#include <windows.h>
/**
*
*/int main(int argc, char **argv) {
//
std::ofstream out ("c:\\temp\\process_manager.log");
//
//это работает и при запуске process_manager.exe руками из консоли
//и при запуске process_manager.exe через java ru.java.process.managerint r_1 = system("echo 123 > c:\\temp\\123.dat");
out << "r_1 : " << r_1 << std::endl;
//а вот это работает при запуске process_manager.exe руками из консоли
//но НЕ работает при запуске process_manager.exe через java ru.java.process.managerint r_2 = system("call c:\\temp\\some_script.cmd");
out << "r_2 : " << r_2 << std::endl;
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
::CreateProcess("C:\\Windows\\System32\\cmd.exe",
"/c c:\\temp\\some_script.cmd", NULL, NULL, true, 0, NULL,
NULL, &si, &pi);
out << "0 create process last error : " << ::GetLastError() << std::endl;
::WaitForSingleObject( pi.hProcess, INFINITE );
DWORD exit_code = 0;
::GetExitCodeProcess(pi.hProcess, &exit_code);
out << "0 create process exit_code : " << exit_code << std::endl;
::CloseHandle( pi.hProcess );
::CloseHandle( pi.hThread );
}
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
::CreateProcess("C:\\Windows\\System32\\cmd.exe",
"/c call c:\\temp\\some_script.cmd", NULL, NULL, true, 0, NULL,
NULL, &si, &pi);
out << "1 create process last error : " << ::GetLastError() << std::endl;
::WaitForSingleObject( pi.hProcess, INFINITE );
DWORD exit_code = 0;
::GetExitCodeProcess(pi.hProcess, &exit_code);
out << "1 create process exit_code : " << exit_code << std::endl;
::CloseHandle( pi.hProcess );
::CloseHandle( pi.hThread );
}
{
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };
::CreateProcess("c:\\temp\\some_script.cmd",
"", NULL, NULL, true, 0, NULL,
NULL, &si, &pi);
out << "2 create process last error : " << ::GetLastError() << std::endl;
::WaitForSingleObject( pi.hProcess, INFINITE );
DWORD exit_code = 0;
::GetExitCodeProcess(pi.hProcess, &exit_code);
out << "1 create process exit_code : " << exit_code << std::endl;
::CloseHandle( pi.hProcess );
::CloseHandle( pi.hThread );
}
//
out.flush();
out.close();
}
При запуске exe файла из консоли все ожидаемо работает :
r_1 : 0
r_2 : 0
0 create process last error : 0
0 create process exit_code : 0
1 create process last error : 0
1 create process exit_code : 0
2 create process last error : 0
1 create process exit_code : 0
При запуске exe файла из java ошибки теже (и файл c:\temp\456.dat не создается):
r_1 : 0
r_2 : 1
0 create process last error : 0
0 create process exit_code : 1
1 create process last error : 0
1 create process exit_code : 1
2 create process last error : 0
1 create process exit_code : 1
Здравствуйте, nikinikiniki, Вы писали:
N>Добрый день, уважаемые гуру!
N>Взываю к вашей помощи, так как ответ сам не могу найти
А вы пробывали дождаться выполнения команды, прежде чем выходить?
is "1", therefore java recognizes that I have killed the process.
Судя по коду возврата (1) из system("call my_cool_batch.cmd") java машина возможно считает, что мой my_cool_batch.cmd кильнулся рановато ...
У меня ситуация чуть хитрее, так как я запускаю system("call my_cool_batch.cmd") из dll, которая запускается из процесса "process_manager.exe", который, в свою очередь, запускается из java машины.
Здравствуйте, EreTIk, Вы писали:
ETI>Здравствуйте, nikinikiniki, Вы писали:
N>>Не работает — все перепробовал. Странно, что при запуске exe из консоли все работает as expected.
ETI>И так тоже не работает: ETI>