Работа со сторонним приложением через Process
Я хочу из другой программы (С#) вызвать первую прогу, а потом считать результат. Делаю это таким образом:
process.StartInfo = new ProcessStartInfo(program, string.Format("{0} {1}", inputFileName, outputFileName));
process.Start();
process.WaitForExit();
По всплывающей консоли я вижу, что программа отрабатывает. А вот выходного файла я не нахожу. В этом и проблема.
Известно, что выходной файл пишется по шаблону:
ofstream out;
out.open(fileOutput);
---------------
Идет запись
---------------
out.close();
Объясните, пожалуйста, что делаю не так.
Process process = new Process();
process.StartInfo = new ProcessStartInfo(program, string.Format("{0} {1}", inputFileName, outputFileName));
//должно помочь если путь к выходному файлу относительный
process.StartInfo.WorkingDirectory = GetCurrentDirectory();
process.Start();
process.WaitForExit();
[/code]
А может быть такое, чтобы у создаваемого процесса не хватало прав на создание файла?
А ручками пробовали запускать - файлик создается?
А ручками пробовали запускать - файлик создается?
Да, вручную создается.
А текущий процесс у меня файлы точно создавал.
Вообще ни разу не было, чтобы моя прога (текущий процесс) не могла создавать файлы, даже не знаю, как это делается)
Хмм.. Присутствует... Сейчас попробую без нее сделать
Или пробелы кавычки и прочая нечисть :)
Нечисть есть) Но есть два момента:
1) Входной файл подпроги тоже содержит в пути всякую нечисть и грузится;
2) Попробовал сделать выходной файл с простым путем: "D:\\outTemp.txt". Результат такой же: никакого результата.
С прогой вроде разобрался. Смог следить за родительским процессом, нашел точку открытия дочернего процесса. Но вот его отследить я не смог. Он выполняется моментально. Но, как я понял, в логе должен наследить. Нету. Прям процесс невидимка.
Подправить прогу на плюсах возможно. Как? После первого упоминания про юникод, глянул на свойства проекта С++, Character Set. Стоит значение Use Unicode Character Set. Или нужно что-то еще подправить?
Там фильтр поставь по имени файла.
Смоделировал ситуацию в двух маленьких прогах. На плюсах она принимает в аргументах адреса файлов, и пишет в них. ВАЖНО! Если аргументы не найдены, то придумывает имя сама. Пишет двумя разными способами: через выходной поток ofstream и через запись в файл fopen(fileName, "w").
Сама по себе прога отрабатывает правильно.
Вторая прога на C# вызывает ее по алгоритму из первого поста.
Тот файл, что пишется через поток - как и было, ничего, пусто, null.
Второй файл, что через fopen, на нем вобще ловится исключение, в функции fprintf.
С юникодной версией попробовал (через wmain). Исход тот же.
У меня так и не заработала. Обменяемся листингами?)
С++:
#include <iostream>
#include <string>
int main(int argc, char* argv[])
// file1 file2 str1 str2
{
char* filename1 = (argc > 1) ? argv[1] : "file1.txt";
char* filename2 = (argc > 2) ? argv[2] : "file2.txt";
std::string str1 = (argc > 3) ? (std::string)argv[3] : "str1";
char* str2 = (argc > 4) ? argv[4] : "str2";
std::ofstream file1;
file1.open( filename1 );
file1 << str1 << std::endl;
file1.close();
FILE* file2 = fopen( filename2, "w" );
fputs( str2, file2 );
fclose( file2 );
return 0;
}
C#:
{
string program = @"D:\VisualStudio Projects\TestConsoleSharp\TestConsoleSharp\bin\Debug\TestConsoleCPP.exe";
string file1 = @"D:\VisualStudio Projects\TestConsoleSharp\TestConsoleSharp\bin\Debug\1.txt";
string file2 = @"D:\VisualStudio Projects\TestConsoleSharp\TestConsoleSharp\bin\Debug\2.txt";
Process process = new Process();
process.StartInfo = new ProcessStartInfo(program, string.Format("{0} {1}", file1, file2));
process.StartInfo.WorkingDirectory = Environment.CurrentDirectory;
process.EnableRaisingEvents = true;
process.Start();
process.WaitForExit();
}
???
Спасибо, не парьтесь)
Добавил кавычки, как выше говорилось. Заработало. Огромное спасибо!