Запуск ДОС-программы и переопределение консольного ввода/выв
От:
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: Запуск ДОС-программы и переопределение консольного ввода
Здравствуйте, 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: Запуск ДОС-программы и переопределение консольного ввода
Hello indlG0, you wrote:
> Файл out создает но не чего туда незаписывает. Немогу разобраться почему мож кто нибуть знает подскажите плиз.
Дос-программы, это не консольные программы. Хоть внешне они и похожи.
--
Всего хорошего, Слава
ICQ: 197577902
Posted via RSDN NNTP Server 2.0
Re: Запуск ДОС-программы и переопределение консольного ввода
У меня заработалотолько вот так:
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);
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить