powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / pipe в Win98
5 сообщений из 5, страница 1 из 1
pipe в Win98
    #33181587
Зрение
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте Все!

Дано: есть программа А под DOS, ее пользовательский интерфейс очень не френдли, исходников ее нет, работает только под Win98, переписать ее функционал нереал в силу определенных адекватных причин.

Задача: написать программу Б, которая будет управлять программой А, но будет еще и другие функции выполнять и иметь красивый пользовательский интерфейс.

Я написала программу Б' пока консольную, чтобы научиться работать с pipe. Теперь, у меня есть консольная Б' оболочка программы А, которая ей и управляет. Но! я это все запрогала под WinXP, а под Win98 эта программа не работает.

Стала разбираться:
1. я перенаправляю поток ввода, задавая указатель на HANDLE созданного pipe, в этот pipe я пишу WriteFile нужные символы. Почему именно так: потому что если не создавать pipe а создавать HANDLE by CreateFile, то когда заканчивается поток из файла, программа А закрывается, не доделав работу. А если создать pipe, то его я закрываю CloseHandle через секунд 30, чтобы программа А все успела сделать.
2. в Win98 если я делаю CreateFile то данные из него отправляются в А, но она рано закрывается. Если я делаю CreatePipe то данные в нее вообще не отправляются.
3. почитала MSDN - поняла, что, кажися, в Win98 нет pipe вообще.

HELP! что делать? Как можно передать программе А что-то, не закрывая поток при этом?

Ух спасибо, что прочли ... Любые идеи?
...
Рейтинг: 0 / 0
pipe в Win98
    #33181653
Зрение
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я написала тестовую программку A'

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
#include <stdio.h> 

int main (void) 
{ 
    FILE* file = fopen("test.txt", "w"); 
    char ch[ 1000 ]; 
    scanf("%s", &ch); 
    fprintf(file, "%s\n", ch); 
    fclose(file); 
    return  0 ; 
} 

Вот код оболочки Б' для A.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
#include <windows.h> 
#include <conio.h> 
  
#define BUFSIZE  4096  
#define PROGA "test.exe" 

DWORD main(int argc, char *argv[]) 
{ 
    SECURITY_ATTRIBUTES saAttr; 
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
    saAttr.bInheritHandle = TRUE; 
    saAttr.lpSecurityDescriptor = NULL; 
    
    HANDLE hChildStdinRd, hChildStdinWr; 
    BOOL boo = CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr,  0 ); 

    HANDLE hChildStdinWrDup; 
    BOOL fSuccess = DuplicateHandle( 
        GetCurrentProcess() 
        , hChildStdinWr 
        , GetCurrentProcess() 
        , &hChildStdinWrDup 
        ,  0  
        , FALSE 
        , DUPLICATE_SAME_ACCESS 
        ); 
    CloseHandle(hChildStdinWr); 

    PROCESS_INFORMATION piProcInfo; 

    STARTUPINFO siStartInfo; 
    siStartInfo.cb = sizeof(STARTUPINFO); 
    siStartInfo.lpReserved = NULL; 
    siStartInfo.lpDesktop = NULL; 
    siStartInfo.lpTitle = NULL; 
    siStartInfo.dwFlags = STARTF_USESTDHANDLES; 
    siStartInfo.cbReserved2 =  0 ; 
    siStartInfo.lpReserved2 = NULL; 

    siStartInfo.hStdInput = hChildStdinRd; 
    siStartInfo.hStdError = NULL; 
    siStartInfo.hStdOutput = NULL; 
    
    BOOL bFuncRetn = ::CreateProcess( 
        NULL 
        , PROGA       // command line 
        , &saAttr          // process security attributes 
        , NULL          // primary thread security attributes 
        , TRUE          // handles are inherited 
        ,  0              // creation flags 
        , NULL          // use parent's environment 
        , NULL          // use parent's current directory 
        , &siStartInfo  // STARTUPINFO pointer 
        , &piProcInfo);  // receives PROCESS_INFORMATION 
  
    if (bFuncRetn) 
    { 
        DWORD dwWritten; 
        CHAR chBuf[BUFSIZE] = "IV"; 
        WriteFile(hChildStdinWrDup, chBuf, strlen(chBuf), &dwWritten, NULL); 
        
        // если закрыть этот hChildStdinWrDup, то прога закроется точно также, как при 
        // CreateFile или <. Но, мне нужно дождаться работы программы А, поэтому, 
        // я жду 15 минут 
        //Sleep(15*60*1000); 
        //CloseHandle(hChildStdinWrDup); 
        // либо сделаю так 
        //DWORD dwWaitResult = ::WaitForSingleObject(piProcInfo.hProcess, INFINITE); 
        // как именно сделаю, я еще не знаю, т.к. не могу протестировать это под Win98 
        // сейчас для скорости 
        Sleep( 1000 ); 
        CloseHandle(hChildStdinWrDup); 
        
        CloseHandle(piProcInfo.hThread); 
        CloseHandle(piProcInfo.hProcess); 
    } 
  
    return  0 ; 
} 

Итак, я извиняюсь, за неверную постановку проблемы: приведенный код под Win98 работает, но! если вместо A' взять A, то этот же код под Win98 перестает работать, но под WinXP он работает!

Теперь, вопрос более четко: что может быть причиной такой работы? Что там в А программе могло быть такого, что под WinXP это работает, а под Win98 нет? (под Win2000 я не проверяла)

Есть ли у кого идеи?
...
Рейтинг: 0 / 0
pipe в Win98
    #33181787
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще говоря, если эту программу можно будет обуздать, только посылая ей поток ввода-вывода, без клавиш, то пайп можно открывать стедствами cmd.exe или command.com, не обязательно программировать на WIN32.
...
Рейтинг: 0 / 0
pipe в Win98
    #33181924
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно лучше не 30 секунд ждать, а ждать завершения работы процесса А?
...
Рейтинг: 0 / 0
pipe в Win98
    #33182016
Зрение
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема в том, что эта программа А закрывается сразу же, как заканчивается входящий поток, т.е. когда заканчивается файл, если делать перенаправление, создавая HANDLE by CreateFile, либо из командной строки A.exe < c.txt, а работая с pipe я могу управлять, когда закрывать pipe. Поэтому, я выжидаю время и закрываю pipe, тогда программа А закрывается, и управление возвращается в основной процесс. Почему А так делает (т.е. завершается, не доделав работы) - мне неясно, с этим сейчас и разбираюсь. Причем, код во втором моем посте работает под WinXP и не работает под Win98 для этой программы А (а для А' работает и там и там).
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / pipe в Win98
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]