Запустите пакетный файл и откройте exe из события нажатия кнопки - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть кнопка в winforms, необходимая для запуска командного файла и открытия exe (monitor.exe) файла при нажатии.Фрагмент командного файла: -

@echo on
rem @echo $Id: runnit_navigator.bat,v X.X XXXX/XX/XX XX:XX:XX sxxxaxx Exp $

echo Running runnit_monitor.bat >%TEMP%\runnit_monitor.log
if exist "%CD%\Config.bat" (
call Config.bat >>%TEMP%\runnit_monitor.log
)
if "%1%" NEQ "" (
set SPACE_SITE=%1%
)

@set monitor_start=Y

rem if not defined SPACE_CONFIG (
rem     set SPACE_CONFIG=%TEMP%
rem )

if not exist "%PROGRAMDATA%\space\config\%SPACE_SITE% \monitor.properties" (
set SPACE_SITE=NA
)

if "%SPACE_SITE%" EQU "NA" (
call "%SPACE_HOME%\Runnit\runnit_site_monitor.bat" >>%TEMP%\runnit_monitor.log
exit
)

set SPACE_SETTINGS=%PROGRAMDATA%\space\config\%SPACE_SITE%

@set JAVA_EXE=%LoginDialogJavaHome%\bin\monitor.exe

Я пробовал этот код, без ошибок, но исполняемый файл вообще не открыт.

Process proc = new Process();
private void btn1_Click(object sender, EventArgs e)
{
    try
    {
        string batDir = string.Format(@"C:\Program Files\Space\Runnit\");
        proc.StartInfo.WorkingDirectory = batDir;
        proc.StartInfo.FileName = "runnit_monitor.bat";
        proc.StartInfo.CreateNoWindow = false;
        proc.Start();
        proc.WaitForExit();
        proc.Close();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.StackTrace.ToString());
    }
}

Кроме того, это вывод длякод выше.После того, как это окно выскочило, ничего не произошло.Но, поставив точку останова, я вижу, что некоторые свойства Process возвращают исключение.

output

Неправильно ли я назвал процесс?Или какие-либо предположения о том, что я могу понять / сделать, чтобы заставить monitor.exe работать после чтения командного файла?

1 Ответ

0 голосов
/ 04 декабря 2018

Я нашел ответ, перейдя по этим ссылкам ..

С здесь (спасибо @FredM, кстати), я знал, что проблема в том, что я доступ к 64-битным процессам из 32-битного процесса .Я могу увидеть ошибку, перехватив свойства Win32Exception.

catch (Win32Exception w)
{
   MessageBox.Show(w.Message);
   MessageBox.Show(w.NativeErrorCode.ToString());
}

Затем я нашел способ исправить это здесь .Я компилирую и запускаю свою программу не как 32-битное приложение.Я просто снимаю флажок предпочитать 32-битный вариант в Project -> Build properties.change project properties

Наконец-то я перестраиваю и все работает отлично!Файл monitor.exe теперь можно успешно запустить.

...