Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Работа со сторонним приложением через Process

10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Есть программа (написанная на C++, но здесь это не важно), которая среди выходных данных имеет файл.
Я хочу из другой программы (С#) вызвать первую прогу, а потом считать результат. Делаю это таким образом:

 
Код:
Process process = new Process();
process.StartInfo = new ProcessStartInfo(program, string.Format("{0} {1}", inputFileName, outputFileName));
process.Start();
process.WaitForExit();


По всплывающей консоли я вижу, что программа отрабатывает. А вот выходного файла я не нахожу. В этом и проблема.

Известно, что выходной файл пишется по шаблону:
 
Код:
char *fileOutput = "outputFile";
ofstream out;
out.open(fileOutput);
---------------
Идет запись
---------------
out.close();


Объясните, пожалуйста, что делаю не так.
277
05 января 2012 года
arrjj
1.7K / / 26.01.2011
[code=c#]
Process process = new Process();
process.StartInfo = new ProcessStartInfo(program, string.Format("{0} {1}", inputFileName, outputFileName));
//должно помочь если путь к выходному файлу относительный
process.StartInfo.WorkingDirectory = GetCurrentDirectory();
process.Start();
process.WaitForExit();
[/code]
10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Я проверял проблему относительного пути. Писал полный путь - проблема сохраняется.
А может быть такое, чтобы у создаваемого процесса не хватало прав на создание файла?
277
05 января 2012 года
arrjj
1.7K / / 26.01.2011
Может, если у текущего процесса нет прав то и у дочернего не будет.
А ручками пробовали запускать - файлик создается?
10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Цитата: arrjj
Может, если у текущего процесса нет прав то и у дочернего не будет.
А ручками пробовали запускать - файлик создается?



Да, вручную создается.
А текущий процесс у меня файлы точно создавал.
Вообще ни разу не было, чтобы моя прога (текущий процесс) не могла создавать файлы, даже не знаю, как это делается)

277
05 января 2012 года
arrjj
1.7K / / 26.01.2011
Посмотри программкой Process Monitor к какому файлу он хочет получить доступ.
20K
05 января 2012 года
sem2711
124 / / 23.09.2009
А в именах файлов или путях к ним присутствует кириллица?
10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Цитата: sem2711
А в именах файлов или путях к ним присутствует кириллица?



Хмм.. Присутствует... Сейчас попробую без нее сделать

277
05 января 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: sem2711
А в именах файлов или путях к ним присутствует кириллица?



Или пробелы кавычки и прочая нечисть :)

10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Цитата: arrjj
Или пробелы кавычки и прочая нечисть :)



Нечисть есть) Но есть два момента:
1) Входной файл подпроги тоже содержит в пути всякую нечисть и грузится;
2) Попробовал сделать выходной файл с простым путем: "D:\\outTemp.txt". Результат такой же: никакого результата.

10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Цитата: arrjj
Посмотри программкой Process Monitor к какому файлу он хочет получить доступ.



С прогой вроде разобрался. Смог следить за родительским процессом, нашел точку открытия дочернего процесса. Но вот его отследить я не смог. Он выполняется моментально. Но, как я понял, в логе должен наследить. Нету. Прям процесс невидимка.

20K
05 января 2012 года
sem2711
124 / / 23.09.2009
Скорее всего прога на C++ не поддерживает юникод. Если запускать ее из консоли и передавать аргументы вручную, то она открывает и входной и выходной файл, а если через студию или прогу на C#, то только выходной файл (поскольку входной она не может найти). Хорошо бы подправить программку на C++, если это возможно...
10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Цитата: sem2711
Скорее всего прога на C++ не поддерживает юникод. Если запускать ее из консоли и передавать аргументы вручную, то она открывает и входной и выходной файл, а если через студию или прогу на C#, то только выходной файл (поскольку входной она не может найти). Хорошо бы подправить программку на C++, если это возможно...



Подправить прогу на плюсах возможно. Как? После первого упоминания про юникод, глянул на свойства проекта С++, Character Set. Стоит значение Use Unicode Character Set. Или нужно что-то еще подправить?

20K
05 января 2012 года
sem2711
124 / / 23.09.2009
Надо в первую очередь посмотреть на функцию main() и ее аргументы. Юникодная версия имеет вид int wmain(int argc, wchar_t* argv[]). Или, если используется хэдер <tchar.h>: int _tmain(int argc, TCHAR* argv[])
277
05 января 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: Cybernetic
С прогой вроде разобрался. Смог следить за родительским процессом, нашел точку открытия дочернего процесса. Но вот его отследить я не смог. Он выполняется моментально. Но, как я понял, в логе должен наследить. Нету. Прям процесс невидимка.



Там фильтр поставь по имени файла.

10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Вести с полей.
Смоделировал ситуацию в двух маленьких прогах. На плюсах она принимает в аргументах адреса файлов, и пишет в них. ВАЖНО! Если аргументы не найдены, то придумывает имя сама. Пишет двумя разными способами: через выходной поток ofstream и через запись в файл fopen(fileName, "w").
Сама по себе прога отрабатывает правильно.
Вторая прога на C# вызывает ее по алгоритму из первого поста.
Тот файл, что пишется через поток - как и было, ничего, пусто, null.
Второй файл, что через fopen, на нем вобще ловится исключение, в функции fprintf.

С юникодной версией попробовал (через wmain). Исход тот же.
20K
05 января 2012 года
sem2711
124 / / 23.09.2009
У меня модель заработала, даже без юникода. Пришлось передать из C# первый аргумент с полным путем. Но тут есть нюанс. Передавать его надо в кавычках, т.к. в пути могут содержаться пробелы.
10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Цитата: sem2711
У меня модель заработала, даже без юникода. Пришлось передать из C# первый аргумент с полным путем. Но тут есть нюанс. Передавать его надо в кавычках, т.к. в пути могут содержаться пробелы.



У меня так и не заработала. Обменяемся листингами?)
С++:

Код:
#include <fstream>
#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#:
Код:
static void Main(string[] args)
{
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();
}


???
10K
05 января 2012 года
Cybernetic
106 / / 22.07.2009
Цитата: Cybernetic
У меня так и не заработала. Обменяемся листингами?)



Спасибо, не парьтесь)
Добавил кавычки, как выше говорилось. Заработало. Огромное спасибо!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог