Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как управлять коммандной строкой другой програмки? 
:(
    Опции темы
son_u
Дата 16.5.2007, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



Есть програмка схемотехнического моделирования, которая имеет свою коммандную строку.
Нужно ее запустить так чтобы автоматически вводилась команда в ее коммандную строку.
Можно ли это осуществить? 
PM MAIL   Вверх
vinter
Дата 16.5.2007, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 1
Всего: 56



что представляет собой командная строка второй проги?


--------------------
Мой блог
PM MAIL WWW   Вверх
son_u
Дата 16.5.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



это программа cygwin эмуляции Linux.....cygwin.com
имеет интерфейс типа того что появляется при вводе cmd в окно выполнить.
PM MAIL   Вверх
FiMa1
Дата 17.5.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: нет
Всего: 6



Цитата(son_u @ 16.5.2007,  21:22)
Есть програмка схемотехнического моделирования, которая имеет свою коммандную строку. Нужно ее запустить так чтобы автоматически вводилась команда в ее коммандную строку.

Вообще запустить ее с некоторыми параметрами командной строки можно через
Код
UINT WinExec(
  LPCSTR lpCmdLine,
  UINT uCmdShow
);

lpCmdLine - указатель на строку, которая, в данном случае, содержит путь к исполняемому файлу твоей программы cygwin и некоторый список необходимых агрументов командной строки, передаваемых этой программе.
Например, вида WinExec("C:\\Program Files\\cygwin\\cygwin.exe -a -b")? Не забываем ставить двойные обратные слэши.
uCmdShow - то, как будет отображено окно запускаемой программы cygwin. В твоем случае, видимо, SW_HIDE. Смотри варианты значений для nCmdShow.
Можно использовать также похожую по назначению функцию ShellExecute.
Как в процессе работы cygwin передавать ему команды через коммандную строку не знаю....
PM   Вверх
Любитель
Дата 18.5.2007, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 1
Всего: 92



Если речь про перенаправление STDIN - копаем в сторону пайпов. Короче - всё, что есть в MSDN, стартую, скажем, от popen (там ссылочки будут)...


--------------------
PM MAIL ICQ Skype   Вверх
son_u
Дата 18.5.2007, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



а по подробнее.я почти новичок
PM MAIL   Вверх
Любитель
Дата 19.5.2007, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 1
Всего: 92



Пример из MSDN

Если непонятно - могу прокоментить по-русски smile


--------------------
PM MAIL ICQ Skype   Вверх
son_u
Дата 26.5.2007, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



не могу разобраться...подскажи по русски smile 
PM MAIL   Вверх
Любитель
Дата 27.5.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 1
Всего: 92



Сорри - сразу не заметил. Комментирую:

Код

#include <windows.h> 
#include <tchar.h>
#include <stdio.h> 
 
#define BUFSIZE 4096 
 
HANDLE
   // Хендля STDIN и STDOUT дочернего процесса для чтения и записи
   hChildStdinRd, hChildStdinWr, hChildStdoutRd,hChildStdoutWr,
   // Хендлы входного файла и STDOUT текущего процесса
   hInputFile, hStdout;
 
BOOL CreateChildProcess(VOID); 
VOID WriteToPipe(VOID); 
VOID ReadFromPipe(VOID); 
VOID ErrorExit(LPSTR); 
 
int _tmain(int argc, TCHAR *argv[]) 
{ 
   SECURITY_ATTRIBUTES saAttr; 
   BOOL fSuccess; 
 
// Установка наследования для пайпов 
 
   saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
   saAttr.bInheritHandle = TRUE; 
   saAttr.lpSecurityDescriptor = NULL; 

// Полчуение текщуего STDOUT. 
 
   hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
 
// Создание пайпа для STDOUT дочернего процесса
 
   if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) 
      ErrorExit("Stdout pipe creation failed\n"); 

// Хендл чтения из STDOUT не наследуем (от текущего)

   SetHandleInformation( hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);

// Создание пайпа для STDIN дочернего процесса 
 
   if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) 
      ErrorExit("Stdin pipe creation failed\n"); 

// Хендл записи в STDIN не наследуем
 
   SetHandleInformation( hChildStdinWr, HANDLE_FLAG_INHERIT, 0);
 
// Создаём дочерний процесс
   
   fSuccess = CreateChildProcess();
   if (! fSuccess) 
      ErrorExit("Create process failed with"); 

// Открываем файл (переданный через команд-лайн) 
 
   if (argc == 1) 
      ErrorExit("Please specify an input file"); 

   printf( "\nContents of %s:\n\n", argv[1]);

   hInputFile = CreateFile(argv[1], GENERIC_READ, 0, NULL, 
      OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); 

   if (hInputFile == INVALID_HANDLE_VALUE) 
      ErrorExit("CreateFile failed"); 
 
// Зпись в пайп (дочерний STDIN) - то, что тебе нужно
 
   WriteToPipe(); 
 
// Чтение вывода дочернего процесса
 
   ReadFromPipe(); 
 
   return 0; 
} 
 
// Создание дочернего процесса
BOOL CreateChildProcess() 
{ 
   TCHAR szCmdline[]=TEXT("child");
   PROCESS_INFORMATION piProcInfo; 
   STARTUPINFO siStartInfo;
   BOOL bFuncRetn = FALSE; 
 
// Зануляем структуру PROCESS_INFORMATION (для CreateProcess)
 
   ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
 
// Инитим структуру STARTUPINFO

   ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
   siStartInfo.cb = sizeof(STARTUPINFO); 
   siStartInfo.hStdError = hChildStdoutWr;
   siStartInfo.hStdOutput = hChildStdoutWr;
   siStartInfo.hStdInput = hChildStdinRd;
   siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
 
// Создаём дочерний процесс
    
   bFuncRetn = CreateProcess(NULL, 
      szCmdline,     // командная строка
      NULL,          // атрибуты безопасности (дефолт) 
      NULL,          // вообщем-то тоже атрибуты безопасности (дефолт) 
      TRUE,          // хендля наследуются (!)
      0,             // дефолтные флаги создания процесса
      NULL,          // используем текущие энввары
      NULL,          // и текущий рабочий каталог
      &siStartInfo,  // STARTUPINFO (входной параметр) 
      &piProcInfo);  // PROCESS_INFORMATION (выходной параметр)  
   
   if (bFuncRetn == 0) 
      ErrorExit("CreateProcess failed\n");
   else 
   {
      // Закрываем хендлы процесса и его основного потока (с самим процессом мы больше общаться не будем)
      CloseHandle(piProcInfo.hProcess);
      CloseHandle(piProcInfo.hThread);
      return bFuncRetn;
   }
}

// Запись в входные данные дочернего процесса
VOID WriteToPipe(VOID) 
{ 
   DWORD dwRead, dwWritten; 
   CHAR chBuf[BUFSIZE];  
 
   for (;;) 
   { 
      // Пытаемся прочитать данные из файла
      if (! ReadFile(hInputFile, chBuf, BUFSIZE, &dwRead, NULL) || 
         dwRead == 0) break; 
      // А теперь пишем их. В пайп для STDIN
      if (! WriteFile(hChildStdinWr, chBuf, dwRead, 
         &dwWritten, NULL)) break; 
   } 
 
// Закрываем пайп - таким образом закрываем поток входных данных для дочернего процесса
 
   if (! CloseHandle(hChildStdinWr)) 
      ErrorExit("Close pipe failed\n"); 
} 
 
VOID ReadFromPipe(VOID) 
{ 
   DWORD dwRead, dwWritten; 
   CHAR chBuf[BUFSIZE]; 

// Предварительно закрываем запись в STDOUT
 
   if (!CloseHandle(hChildStdoutWr)) 
      ErrorExit("Closing handle failed"); 
 
   for (;;) 
   { 
      // Читаем, что там вывел дочерний процесс
      if( !ReadFile( hChildStdoutRd, chBuf, BUFSIZE, &dwRead, 
         NULL) || dwRead == 0) break;
      // Пишем сие в свой STDOUT (можно юзать printf, std::cout и т. д.) 
      if (! WriteFile(hStdout, chBuf, dwRead, &dwWritten, NULL)) 
         break; 
   } 
} 

// Без коммментариев :)
VOID ErrorExit (LPSTR lpszMessage) 
{ 
   fprintf(stderr, "%s\n", lpszMessage); 
   ExitProcess(0); 
}


То, где будет пайп для STDIN и STDOUT дочернего процесса определяется наследованием. Поэтому запись в STDIN и чтение из STDOUT (юзаемое нами) - не наследуется.

Думаю теперь понятно smile


--------------------
PM MAIL ICQ Skype   Вверх
Ziliboba123
Дата 7.2.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 6.2.2009

Репутация: нет
Всего: -1



извените за некрофильство =)

TCHAR szCmdline[]=TEXT("child"); - я так понимаю тут надо писать имя консольного приложения например 001.exe находящегося рядом с этим откомпилированным исодником. 

Выдает ошибку: "CreateProcess failed with error 2: Не удаетсья найти файл". Подскажите пожалуста.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1321 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.