Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получение инфы из другого процесса 
:(
    Опции темы
ershovdz
  Дата 9.10.2009, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть версия архиватора 7z для командной строки. Хочется из своего процесса запустить в командной строке архивирование и получить инфу, которую архиватор выплевывает в командную строку (прогресс архивирования). Как вариант, можно перенаправить вывод этой инфы в файл и потом его парсить периодически.. Но мне этот вариант чего то не очень нравится. Может еще чего можно придумать ?
PM MAIL   Вверх
Loki
Дата 9.10.2009, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



а собственно что потом делать с выводом? писать логи в своем формате? и зачем это на Си? не проще ли в шел-скрипте запускать?
PM MAIL   Вверх
Alek86
Дата 9.10.2009, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

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



CreateProcess() принимает указатель на структуру STARTUPINFO (lpStartupInfo), у которого есть поле hStdOutput
туда нужно поместить хендл на свой пайп
подробнее:
http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx
http://msdn.microsoft.com/en-us/library/ms686331(VS.85).aspx


--------------------
user posted image    user posted image
PM MAIL   Вверх
ershovdz
Дата 9.10.2009, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

а собственно что потом делать с выводом? писать логи в своем формате? 


Мне нужно из asp кода, обратиться по средством COM интерфейса к серверной длл. Причем веб сервер и сама длл могут быть разнесены на разные машины. Эта длл, на той машине, что находится по команде юзера с веб морды, будет запускать архивирование. Архиватор 7z. Мне нужно на веб морде отображать статус архивирования (сколько процентов набежало). Архиватор кидает в командную строку эти самые проценты. Я хочу из длл получить доступ к этим данным, чтобы распарсить и вернуть веб морде, по запросу, прогресс...

Цитата

CreateProcess() принимает указатель на структуру STARTUPINFO (lpStartupInfo.....


Спасибо большое, посмотрю. Только CreateProcess мне не очень нравится тем, что я должен точно знать, где находится архиватор. А через, например, ShellExecuteEx я могу через переменные окружения взять инфу о расположении архиватора.



Это сообщение отредактировал(а) ershovdz - 9.10.2009, 16:28
PM MAIL   Вверх
ershovdz
Дата 9.10.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообщем нашел такой код

Код

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#pragma hdrstop
//#include <condefs.h>
#define bzero(a) memset(a,0,sizeof(a)) //для сокращения писанины
bool IsWinNT() //проверка запуска под NT
{
    OSVERSIONINFO osv;
    osv.dwOSVersionInfoSize = sizeof(osv);
    GetVersionEx(&osv);
    return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
void ErrorMessage(char *str) //вывод подробной информации об ошибке
{
    LPVOID msg;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM
        ,NULL
        ,GetLastError()
        ,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)
        ,(LPSTR)&msg
        ,0
        ,NULL);
    printf("%s: %s\n",str,msg);
    LocalFree(msg);
}
//----------------------------------------------------------------------
void main()
{
    char buf[1024]; //буфер ввода/вывода
    STARTUPINFO si;
    SECURITY_ATTRIBUTES sa;
    SECURITY_DESCRIPTOR sd; //структура security для пайпов
    PROCESS_INFORMATION pi;
    HANDLE newstdin,newstdout,read_stdout,write_stdin; //дескрипторы// пайпов
    if (IsWinNT()) //инициализация security для Windows NT
    {
        InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
        SetSecurityDescriptorDacl(&sd, true, NULL, false);
        sa.lpSecurityDescriptor = &sd;
    }
    else 
        sa.lpSecurityDescriptor = NULL;
    
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = true; //разрешаем наследование дескрипторов
    if (!CreatePipe(&newstdin,&write_stdin,&sa,0)) //создаем пайп// для stdin
    { 
        ErrorMessage("CreatePipe");
        getch();
        return;
    }
    if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //создаем пайп// для stdout
    {
        ErrorMessage("CreatePipe");
        getch();
        CloseHandle(newstdin);
        CloseHandle(write_stdin);
        return;
    }
    GetStartupInfo(&si); //создаем startupinfo для
    // дочернего процесса
    /*Параметр dwFlags сообщает функции CreateProcess
    как именно надо создать процесс.
    STARTF_USESTDHANDLES управляет полями hStd*.STARTF_USESHOWWINDOW управляет полем wShowWindow.*/
    si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    si.hStdOutput = newstdout;
    si.hStdError = newstdout; //подменяем дескрипторы для
    si.hStdInput = newstdin; // дочернего процесса
    //это просто
    //пример,
    //замените на то,
    //что вам нужно
    
    //создаем дочерний процесс
    if (!CreateProcess(NULL, "D:\\7za.exe a D:\\test.zip D:\\test.txt",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi))
    {
        ErrorMessage("CreateProcess");
        getch();
        CloseHandle(newstdin);
        CloseHandle(newstdout);
        CloseHandle(read_stdout);
        CloseHandle(write_stdin);
        return;
    }
    unsigned long exit=0; //код завершения процесса
    unsigned long bread; //кол-во прочитанных байт
    unsigned long avail; //кол-во доступных байт
    unsigned long status;
    bzero(buf);
    for(;;) //основной цикл программы
    {
        GetExitCodeProcess(pi.hProcess,&exit); //пока дочерний процесс// не закрыт
        if (exit != STILL_ACTIVE)
            break;
        PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);//Проверяем, есть ли данные для чтения в stdout
        
        if (bread != 0)
        {
            bzero(buf);
            if (avail > 1023)
            {
                while (bread >= 1023)
                {
                    ReadFile(read_stdout,buf,1023,&bread,NULL); //читаем из
                                                                // пайпа stdout
                    printf("%s",buf);
                    bzero(buf);
                }
            }
            else
            {
                ReadFile(read_stdout,buf,1023,&bread,NULL);
                printf("%s",buf);
            }
        }
    }
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    CloseHandle(newstdin); //небольшая уборка за собой
    CloseHandle(newstdout);
    CloseHandle(read_stdout);
    CloseHandle(write_stdin);}


Чего то все равно не выводит нифига. Где затык ?
PM MAIL   Вверх
jonie
Дата 9.10.2009, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



ershovdz, проще воспользоваться прилагаемой к 7z SDK, нежели парсить что-то с консоли имхо


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ershovdz
Дата 12.10.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(jonie @ 9.10.2009,  19:16)
ershovdz, проще воспользоваться прилагаемой к 7z SDK, нежели парсить что-то с консоли имхо

А есть где-нибудь описание - как им пользоваться ? На оф сайте чего то не нашел..

Это сообщение отредактировал(а) ershovdz - 12.10.2009, 13:30
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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