Перенаправление ввода-вывода CreateProcess, CreatePipe

Тема в разделе "WASM.WIN32", создана пользователем CaptainObvious, 20 янв 2024.

  1. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    Дратути
     
    Последнее редактирование: 21 янв 2024
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.993
    У тебя куча проверок на INVALID_HANDLE_VALUE, но ты нигде это значение не устанавливаешь. Если хендл чем-то где-то оказался закрыт, он инвалид конечно, но он не минусадин. Такая вот фантастика.
     
  3. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    При запуске пробовал присваивать всем глобальным переменным значение DWORD(-1).
    Как корректно проверить на INVALID_HANDLE_VALUE чтобы не было глюков? Думаете именно из за этого?
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.993
    Там, где ты хендл закрываешь, устанавливай в хендл INVALID_HANDLE_VALUE, если ты так остальному коду сигнализируешь, что не надо туда больше лезть.
     
  5. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    При запуске присваиваю ко всем глобальным переменным DWORD(-1):
    Код (Text):
    1.   hPipeInputRead := INVALID_HANDLE_VALUE;
    2.   hPipeInputWrite := INVALID_HANDLE_VALUE;
    3.   hPipeOutputRead := INVALID_HANDLE_VALUE;
    4.   hPipeOutputWrite := INVALID_HANDLE_VALUE;
    5.  
    6.   hProcess := INVALID_HANDLE_VALUE;
    7.   hThread := INVALID_HANDLE_VALUE;
    8.   ThreadId := INVALID_HANDLE_VALUE;
    Заменил CloseHandle на CloseHandleEx:

    Код (Text):
    1. procedure CloseHandleEx(var hObject: THandle);
    2. begin
    3.   hObject := INVALID_HANDLE_VALUE;
    4.   //CloseHandle(hObject);
    5. end;
    Всегда отлаживал код отладочным выводом, здесь не могу осилить.

    Точно так же, вылетает
    --- Сообщение объединено, 20 янв 2024 ---
    Возможно проблема с потоками который читает
    Код (Text):
    1. ReadFile(hPipeOutputRead, buf, Length(buf), BytesCount, nil)
    И который пишет в Pipe
    Код (Text):
    1. WriteFile(hPipeInputWrite, buf, Length(s) + 2, BytesCount, nil);
     
    Последнее редактирование: 20 янв 2024
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.993
    В них родимых и есть. Попытка читать-писать закрытый хендл дает c0000008. CloseHandle принимает значение - номер хендла, и закрывает объект, на этом его полномочия все. Но в переменной у тебя остается этот номер, он проходит проверку на !=-1 и дает тебе это исключение попыткой залезть в эту трубу. Не давай программе лезть в закрытый тобой хендл.
     
  7. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    f13nd, план был такой:

    Взять несколько WinApi функций и собрать из них работающую прогу.
    Если будут какие-то баги, найти их отладочным выводом.

    В теории все замечательно, на практике много подводных камней..

    Как сделать, чтобы
    Код (Text):
    1. ReadFile(hPipeOutputRead, buf, Length(buf), BytesCount, nil);
    и
    Код (Text):
    1. WriteFile(hPipeInputWrite, buf, Length(s) + 2, BytesCount, nil);
    Не вызывали Access Violation, External exception C0000008 и т.д. ?
     
  8. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.993
    Вот это у тебя для красоты вставлено?
    Код (Text):
    1.     if hPipeOutputRead <> INVALID_HANDLE_VALUE then
    Я в первом посте написал - после закрытия хендла присваивай переменной, хранящей хендл, INVALID_HANDLE_VALUE. Потому что CloseHandle этого за тебя не сделает. И тогда твои потоки не будут вызывать исключение.

    ЗЫ: кстати еще.
     
    CaptainObvious нравится это.
  9. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    Код (Text):
    1. Вот это у тебя для красоты вставлено?
    Осталось с тех пор когда пытался найти ошибку методом тыка. Можно сказать для красоты

    Отладчик вываливается в такое вот окно:
    [​IMG]
    --- Сообщение объединено, 20 янв 2024 ---
    Вываливается до того как закрываем хэндлы
    --- Сообщение объединено, 20 янв 2024 ---
    Могу заблуждаться, конфликт между:
    Код (Text):
    1. procedure InputText(s: string);
    2. var      
    3.   BytesCount: Cardinal;
    4.   buf: array [0..4096] of Char;
    5. begin
    6.   if Length(s) < 4090 then
    7.   begin
    8.     ZeroMemory(@buf, SizeOf(buf));
    9.     StrPCopy(buf, s + #13#10); //
    10.     WriteFile(hPipeInputWrite, buf, Length(s) + 2, BytesCount, nil);
    11.   end;
    12. end;
    и
    Код (Text):
    1. procedure ReadThreadProc;
    2. var
    3.   BytesCount: Cardinal;
    4.   buf: array [0..4096] of Char;
    5. begin
    6.   Terminated := false;
    7.   while not Terminated do
    8.   begin
    9.     //if hPipeOutputRead <> INVALID_HANDLE_VALUE then
    10.     begin
    11.       ZeroMemory(@buf, SizeOf(buf));
    12.       if ReadFile(hPipeOutputRead, buf, Length(buf), BytesCount, nil) then
    13.       begin
    14.         if BytesCount <> 0 then
    15.         begin
    16.           OemToAnsiBuff(buf, buf, BytesCount);
    17.           Form1.Memo2.Text := Form1.Memo2.Text + Copy(buf, 1, BytesCount);
    18.         end;
    19.       end;
    20.     end;
    21.   end;
    22. end;
     
    Последнее редактирование: 20 янв 2024
  10. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.993
    Очень информативное окно. Взглянув я сразу прикинул в уме в каких билдах венды и в какой библиотеке по смещению, оканчивающемуся на 07C5, есть такая инструкция.
     
    M0rg0t нравится это.
  11. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    f13nd, не зря значит я картинку запостил :)
     
    Последнее редактирование: 20 янв 2024
  12. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.993
    Ну я не знаю что еще предложить. Где-то там возникает исключение. Но оно точно не там, где можно подумать. Есть отладчик, но он не алиса и нужную строчку кода не подсвечивает.
     
    M0rg0t нравится это.
  13. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    f13nd, тогда другой вопрос, что надобно сделать, чтобы ReadFile и WriteFile не спотыкались друг об друга?
     
  14. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.993
    Они с разными пайпами работают и вроде бы даже правильные хендлы процессу выданы.
     
  15. CaptainObvious

    CaptainObvious Member

    Публикаций:
    1
    Регистрация:
    18 янв 2024
    Сообщения:
    87
    f13nd, вроде понятно стало, спасибо за грамотный ответ
     
    Последнее редактирование: 20 янв 2024