Запуск ДОС-программы и переопределение консольного ввода/выв
От: indlG0  
Дата: 12.04.06 20:50
Оценка:
Вот код программы:

STARTUPINFOA        syst;
PROCESS_INFORMATION prc;
OFSTRUCT        of;

GetStartupInfo(&syst);

HANDLE  h1 = CreateFile("D:\\testing\\out",
            GENERIC_WRITE,
            FILE_SHARE_WRITE,
            NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
            NULL);

HANDLE  h2 = (HANDLE)OpenFile("D:\\testing\\in",&of,OF_READ);
        
ZeroMemory(&syst,sizeof(STARTUPINFO));    
syst.cb         = sizeof(STARTUPINFO);            
syst.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
syst.hStdInput  = h2;
syst.hStdOutput = h1;
        
CreateProcess( "D:\\testing\\n.exe", 0, 0, 0, FALSE, REALTIME_PRIORITY_CLASS, 0, 0, &syst, &prc);

WaitForSingleObject( prc.hProcess, INFINITE );

CloseHandle(h2);
CloseHandle(h1);

Файл out создает но не чего туда незаписывает. Немогу разобраться почему мож кто нибуть знает подскажите плиз.
Re: Запуск ДОС-программы и переопределение консольного ввода
От: Сергей  
Дата: 12.04.06 21:33
Оценка:
Здравствуйте, indlG0, Вы писали:

>[...]


Я когда-то пробовал сделать такую штуку. У меня не получилось, создалось впечатление, что когда ДОС-прога пытается что-то вывести, ntvdm.exe "рисует" её вывод в консоли, и что ДОС-овые потоки ввода/вывода с соотв. виндовым не связаны никак. Вроде даже видел в инете подтверждение этой догадки.
Re: Запуск ДОС-программы и переопределение консольного ввода
От: ekamaloff Великобритания  
Дата: 13.04.06 04:09
Оценка:
Здравствуйте, indlG0, Вы писали:

G>
G>STARTUPINFOA        syst;
G>PROCESS_INFORMATION prc;
G>OFSTRUCT        of;
G>SECURITY_ATTRIBUTES sa;

G>GetStartupInfo(&syst);

G>ZeroMemory(&sa, sizeof(sa));
G>sa.bInheritHandle = TRUE;

G>HANDLE  h1 = CreateFile("D:\\testing\\out",
G>            GENERIC_WRITE,
G>            FILE_SHARE_WRITE,
G>            &sa,
G>            CREATE_ALWAYS,
G>            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
G>            NULL);

G>// Вот это тоже заменить на CreateFile
G>HANDLE  h2 = (HANDLE)OpenFile("D:\\testing\\in",&of,OF_READ);
        
G>ZeroMemory(&syst,sizeof(STARTUPINFO));    
G>syst.cb         = sizeof(STARTUPINFO);            
G>syst.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
G>syst.hStdInput  = h2;
G>syst.hStdOutput = h1;
        
G>CreateProcess( "D:\\testing\\n.exe", 0, 0, 0, TRUE, REALTIME_PRIORITY_CLASS, 0, 0, &syst, &prc);

G>WaitForSingleObject( prc.hProcess, INFINITE );

G>CloseHandle(h2);
G>CloseHandle(h1);
G>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re[2]: Запуск ДОС-программы и переопределение консольного вв
От: Аноним  
Дата: 13.04.06 06:12
Оценка:
STARTUPINFOA        syst;
PROCESS_INFORMATION prc;
OFSTRUCT        of;
SECURITY_ATTRIBUTES sa;

STARTUPINFOA        syst;
PROCESS_INFORMATION prc;
OFSTRUCT        of;
SECURITY_ATTRIBUTES sa;


GetStartupInfo(&syst);

ZeroMemory(&sa, sizeof(sa));
sa.bInheritHandle = TRUE;
        
HANDLE  h1 = CreateFile("D:\\testing\\out",
            GENERIC_WRITE,
            FILE_SHARE_WRITE,
            &sa,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
            NULL);

HANDLE  h2 = CreateFile("D:\\testing\\in",
            GENERIC_READ,
            FILE_SHARE_READ,
            &sa,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
        
ZeroMemory(&syst,sizeof(STARTUPINFO));    
syst.cb         = sizeof(STARTUPINFO);            
syst.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
syst.hStdInput  = h2;
syst.hStdOutput = h1;
        
CreateProcess(    "D:\\testing\\n.exe", 
        0, 0, 0, TRUE, 
        REALTIME_PRIORITY_CLASS, 
        0, 0, 
        &syst, 
        &prc);

WaitForSingleObject( prc.hProcess, INFINITE );

CloseHandle(h2);
CloseHandle(h1);

И все равно файл OUT остаеться пустым. Мда в чем же проблема.

Второй способ решения этой проблемы(не очень)
Может мне создовать БАТ файл с переопределением ввода вывода и программно его запускать вот тока там проблема будет работать только одно переопределение будет либо вывода, либо ввода хотя в файле оба переопределены, то что первым встречаеться то и выполняеться а на остальное забиваеться.
Re: Запуск ДОС-программы и переопределение консольного ввода
От: Slava Antonov Россия http://deadbeef.narod.ru
Дата: 13.04.06 10:09
Оценка:
Hello indlG0, you wrote:

> Файл out создает но не чего туда незаписывает. Немогу разобраться почему мож кто нибуть знает подскажите плиз.


Дос-программы, это не консольные программы. Хоть внешне они и похожи.

--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re: Запуск ДОС-программы и переопределение консольного ввода
От: andrey.def Россия  
Дата: 13.04.06 10:30
Оценка:
У меня заработалотолько вот так:

            SECURITY_ATTRIBUTES sa;
            PROCESS_INFORMATION pi;
            STARTUPINFO StrInf;
            memset(&sa, 0, sizeof(sa));
            sa.nLength = sizeof(sa);
            sa.bInheritHandle = TRUE;
            HANDLE hRead, hWrite;
            if (!CreatePipe(&hRead, &hWrite, &sa, 0))
                throw 1L;
            memset(&StrInf, 0, sizeof(StrInf));
            StrInf.cb = sizeof(StrInf);
            StrInf.hStdOutput = hWrite;
            StrInf.dwFlags=STARTF_USESTDHANDLES;
            StrInf.dwFillAttribute=SYNCHRONIZE;

            if (!CreateProcess( NULL, 
                lpCL.GetBuffer(), NULL, NULL, TRUE, 
                CREATE_NO_WINDOW ,
                NULL,
                NULL,
                &StrInf,
                &pi))
                throw 1L;
            CloseHandle(hWrite);

В результате Output в hRead, без трубы почему-то не завелось
Re[2]: Запуск ДОС-программы и переопределение консольного вв
От: vvotan Россия  
Дата: 13.04.06 13:00
Оценка:
Здравствуйте, Slava Antonov, Вы писали:


SA>Дос-программы, это не консольные программы. Хоть внешне они и похожи.

Внешне они похожи потому, что запускаются на эмуляторе, который является консольной программой.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Запуск ДОС-программы и переопределение консольного ввода
От: indlG0  
Дата: 13.04.06 13:26
Оценка:
G>Вот код программы:

G>
G>STARTUPINFOA        syst;
G>PROCESS_INFORMATION prc;
G>OFSTRUCT        of;

G>GetStartupInfo(&syst);

G>HANDLE  h1 = CreateFile("D:\\testing\\out",
G>            GENERIC_WRITE,
G>            FILE_SHARE_WRITE,
G>            NULL,
G>            CREATE_ALWAYS,
G>            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
G>            NULL);

G>HANDLE  h2 = (HANDLE)OpenFile("D:\\testing\\in",&of,OF_READ);
        
G>ZeroMemory(&syst,sizeof(STARTUPINFO));    
G>syst.cb         = sizeof(STARTUPINFO);            
G>syst.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
G>syst.hStdInput  = h2;
G>syst.hStdOutput = h1;
        
G>CreateProcess( "D:\\testing\\n.exe", 0, 0, 0, FALSE, REALTIME_PRIORITY_CLASS, 0, 0, &syst, &prc);

G>WaitForSingleObject( prc.hProcess, INFINITE );

G>CloseHandle(h2);
G>CloseHandle(h1);
G>

Этот код работает только когда создаем консолевское приложение, а вот когда обычное виндовское он не хотит писать в файл и скорее все не читает из файла. Мож там дело в HANDLE-х для ВИн32 и дляконсольного они разные или что нибуть в етом роде. Подскажите как же в виндовской проге етот код зароботал.
Re[2]: Запуск ДОС-программы и переопределение консольного вв
От: indlG0  
Дата: 13.04.06 13:30
Оценка:
Ошибся вот етот код работает:

STARTUPINFOA        syst;
PROCESS_INFORMATION prc;
OFSTRUCT            of;
SECURITY_ATTRIBUTES sa;


GetStartupInfo(&syst);

ZeroMemory(&sa, sizeof(sa));
sa.bInheritHandle = TRUE;
        
HANDLE  h1 = CreateFile("D:\\testing\\out",
            GENERIC_WRITE,
            FILE_SHARE_WRITE,
            &sa,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH,
            NULL);

HANDLE  h2 = CreateFile("D:\\testing\\in",
            GENERIC_READ,
            FILE_SHARE_READ,
            &sa,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL);
        
ZeroMemory(&syst,sizeof(STARTUPINFO));    
syst.cb         = sizeof(STARTUPINFO);            
syst.dwFlags    = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 
syst.hStdInput  = h2;
syst.hStdOutput = h1;
        
CreateProcess("D:\\testing\\n.exe", 
              0, 0, 0, TRUE, 
              REALTIME_PRIORITY_CLASS, 
              0, 0, 
              &syst, 
              &prc);

WaitForSingleObject( prc.hProcess, INFINITE );

CloseHandle(h2);
CloseHandle(h1);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.