Приложение C # Windows forms с использованием процесса. запуск на виртуальной машине Windows XP

#c# #windows #process.start #microfocus

#c# #Windows #process.start #микрофокус

Вопрос:

Вот ситуация. У нас есть очень старый COBOL exe, который будет работать только в Windows XP. Для запуска этого exe-файла мы настроили виртуальную машину XP. Каждую неделю пользователь запускает серию файлов BAT.

Я пытаюсь написать приложение C # для Windows, которое будет работать на виртуальной машине, а затем выполнить COBOL exe. План состоит в том, чтобы использовать процесс.Начните вызывать EXE. Все работает нормально, ЕСЛИ МОЙ WINDOWS C # EXE запускается в том же каталоге, что и COBOL exe.

Когда я перемещаю C # exe из папки, я получаю неверный код возврата, и cobol не выполняется.

Не вдаваясь в подробности, я хочу иметь возможность запускать COBOL извне папки. Причина в том, что у нас есть несколько региональных офисов, и у каждого из них есть своя собственная папка и своя копия cobol exe внутри каждой папки. Цель здесь состоит в том, чтобы позволить пользователю выбрать каждое региональное отделение, а затем программа C # выполнит каждую программу в каждом каталоге.

Вкратце. Если я запускаю C # внутри папки, в которой находится исполняемый файл COBOL, ОН РАБОТАЕТ. НО если я перемещаю C # за пределы этой папки, это НЕ

Я надеюсь, что все это имеет смысл. Вот некоторые дополнительные сведения:

  1. Создано в Visual Studio 2012 как приложение C # для Windows
  2. Целевая платформа x86 (я также использовал любой процессор)
  3. Целевая платформа .NET Framework 4
  4. COBOL — это микрофокус 1997 года выпуска (да, я знаю. Нам нужно избавиться от этого)
  5. Виртуальная машина — это Windows XP
  6. Если я изменю exe файл на Блокнот, он будет работать нормально
  7. Если я все-таки запущу run из Windows и вставлю это: K:AMSappMYTESTFOLDERAMSBLD.exe он работает нормально.

  8. Код C # для события нажатия кнопки (примечание: если я изменю имя файла на это K:AMSappMYTESTFOLDERAMSBLD.exe я получаю те же результаты. Он не запускается ) Также в окне сообщения отображается 255 для кода возврата, когда он не работает. Если программа на C # перемещается внутрь папки cobol, она возвращает ноль.

     private void button1_Click(object sender, EventArgs e)
    {
        try
        {
    
            int exitCode;
    
    
                Process process = new Process();
                process.StartInfo.FileName = @"\SERVER23021PRODDATAAMSappMYTESTFOLDERAMSBLD.exe";
    
    
    
                process.StartInfo.ErrorDialog = true;
    
                process.Start();
                process.WaitForExit(1000 * 60 * 5);    // Wait up to five minutes.
    
                exitCode = process.ExitCode;
                MessageBox.Show("My exit code = "   exitCode.ToString());
    
                MessageBox.Show("my path and file name: "   process.StartInfo.FileName);
    
    
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
    
        }
    }
      

Комментарии:

1. Попробуйте process.StartInfo.WorkingDirectory = Path.GetFullPath(process.StartInfo.FileName);

2. Похоже, у вас может возникнуть проблема с разрешением на выполнение. Я бы посмотрел, под какой учетной записью вы используете их, и разрешено ли этой учетной записи запускать оба приложения. Кроме того, если вы пересекаете какие-либо границы, вам может потребоваться просмотреть олицетворение при выполнении вызова.

3. >>> ЭТО СРАБОТАЛО. Сначала он не использовал полный сетевой путь. Я изменил его на K: затем путь к файлу. Также я вместо использования Path . GetFullPath(процесс. StartInfo. Имя файла) Я просто жестко запрограммировал K: path минус фактическое имя файла, и это сработало. Большое спасибо.

Ответ №1:

Попробуйте установить для рабочего каталога процесса тот же путь, что и для файла cobol exe.

 process.StartInfo.WorkingDirectory = System.IO.Path.GetFullPath(process.StartInfo.FileName);
  

Комментарии:

1. Мой комментарий был просто для того, чтобы дать подсказку OP. Но это неправильный ответ. Что делать, если этот код вызывается перед настройкой process.StartInfo.FileName ? Синтаксически правильно, но логически неправильно.. Поэтому не копируйте чужие коды, напишите правильный самостоятельно..

Ответ №2:

Я думаю, вам следует использовать ProcessStartInfo.Domain для установки домена и после этого пути к exe внутри ProcessStartInfo.FileName . Экземпляр ProcessStartInfo перехода в Process.Start метод

 ProcessStartInfo psi = new ProcessStartInfo();
psi.Domain = @"SERVER23021";
psi.FileName = @"PRODDATAAMSappMYTESTFOLDERAMSBLD.exe";

Process.Start(psi);
  

Если вам нужно персонализировать свой вызов, вы можете установить Username и Password . Но вы должны помнить, что вам нужно предоставить их как пару. UseShellExecute должно быть установлено значение false и WorkingDirectory должно быть также предоставлено. Подробнее: https://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.password (v = против 110).aspx

Комментарии:

1. Что должно быть установлено ProcessStartInfo.Domain ? Как вы думаете, почему это должно решить проблему OP? Почему вы описываете это вместо публикации нескольких строк компилируемого / рабочего кода?

2. @L.B: сначала посмотрите на ваш комментарий. Нет причин, по которым это могло бы помочь. Никаких подсказок о том, что он делает. Если вы проголосовали против, пожалуйста, не будьте таким лицемером. Я не вставлял никакого кода, потому что он есть в документации с объяснением. Я точно указал, какой класс следует использовать, какое свойство следует использовать для этого класса и куда передать экземпляр этого класса

3. Look at yours comment first Да, это комментарий , а не ответ. Если вы публикуете что-то в качестве ответа, это должен быть ответ

4. До сих пор я не мог комментировать. Я смог сделать это только в своем ответе. Вы должны иметь в виду, что новые пользователи не могут комментировать все