У тебя куча проверок на INVALID_HANDLE_VALUE, но ты нигде это значение не устанавливаешь. Если хендл чем-то где-то оказался закрыт, он инвалид конечно, но он не минусадин. Такая вот фантастика.
При запуске пробовал присваивать всем глобальным переменным значение DWORD(-1). Как корректно проверить на INVALID_HANDLE_VALUE чтобы не было глюков? Думаете именно из за этого?
Там, где ты хендл закрываешь, устанавливай в хендл INVALID_HANDLE_VALUE, если ты так остальному коду сигнализируешь, что не надо туда больше лезть.
При запуске присваиваю ко всем глобальным переменным DWORD(-1): Код (Text): hPipeInputRead := INVALID_HANDLE_VALUE; hPipeInputWrite := INVALID_HANDLE_VALUE; hPipeOutputRead := INVALID_HANDLE_VALUE; hPipeOutputWrite := INVALID_HANDLE_VALUE; hProcess := INVALID_HANDLE_VALUE; hThread := INVALID_HANDLE_VALUE; ThreadId := INVALID_HANDLE_VALUE; Заменил CloseHandle на CloseHandleEx: Код (Text): procedure CloseHandleEx(var hObject: THandle); begin hObject := INVALID_HANDLE_VALUE; //CloseHandle(hObject); end; Всегда отлаживал код отладочным выводом, здесь не могу осилить. Точно так же, вылетает --- Сообщение объединено, 20 янв 2024 --- Возможно проблема с потоками который читает Код (Text): ReadFile(hPipeOutputRead, buf, Length(buf), BytesCount, nil) И который пишет в Pipe Код (Text): WriteFile(hPipeInputWrite, buf, Length(s) + 2, BytesCount, nil);
В них родимых и есть. Попытка читать-писать закрытый хендл дает c0000008. CloseHandle принимает значение - номер хендла, и закрывает объект, на этом его полномочия все. Но в переменной у тебя остается этот номер, он проходит проверку на !=-1 и дает тебе это исключение попыткой залезть в эту трубу. Не давай программе лезть в закрытый тобой хендл.
f13nd, план был такой: Взять несколько WinApi функций и собрать из них работающую прогу. Если будут какие-то баги, найти их отладочным выводом. В теории все замечательно, на практике много подводных камней.. Как сделать, чтобы Код (Text): ReadFile(hPipeOutputRead, buf, Length(buf), BytesCount, nil); и Код (Text): WriteFile(hPipeInputWrite, buf, Length(s) + 2, BytesCount, nil); Не вызывали Access Violation, External exception C0000008 и т.д. ?
Вот это у тебя для красоты вставлено? Код (Text): if hPipeOutputRead <> INVALID_HANDLE_VALUE then Я в первом посте написал - после закрытия хендла присваивай переменной, хранящей хендл, INVALID_HANDLE_VALUE. Потому что CloseHandle этого за тебя не сделает. И тогда твои потоки не будут вызывать исключение. ЗЫ: кстати еще.
Код (Text): Вот это у тебя для красоты вставлено? Осталось с тех пор когда пытался найти ошибку методом тыка. Можно сказать для красоты Отладчик вываливается в такое вот окно: --- Сообщение объединено, 20 янв 2024 --- Вываливается до того как закрываем хэндлы --- Сообщение объединено, 20 янв 2024 --- Могу заблуждаться, конфликт между: Код (Text): procedure InputText(s: string); var BytesCount: Cardinal; buf: array [0..4096] of Char; begin if Length(s) < 4090 then begin ZeroMemory(@buf, SizeOf(buf)); StrPCopy(buf, s + #13#10); // WriteFile(hPipeInputWrite, buf, Length(s) + 2, BytesCount, nil); end; end; и Код (Text): procedure ReadThreadProc; var BytesCount: Cardinal; buf: array [0..4096] of Char; begin Terminated := false; while not Terminated do begin //if hPipeOutputRead <> INVALID_HANDLE_VALUE then begin ZeroMemory(@buf, SizeOf(buf)); if ReadFile(hPipeOutputRead, buf, Length(buf), BytesCount, nil) then begin if BytesCount <> 0 then begin OemToAnsiBuff(buf, buf, BytesCount); Form1.Memo2.Text := Form1.Memo2.Text + Copy(buf, 1, BytesCount); end; end; end; end; end;
Очень информативное окно. Взглянув я сразу прикинул в уме в каких билдах венды и в какой библиотеке по смещению, оканчивающемуся на 07C5, есть такая инструкция.
Ну я не знаю что еще предложить. Где-то там возникает исключение. Но оно точно не там, где можно подумать. Есть отладчик, но он не алиса и нужную строчку кода не подсвечивает.
f13nd, тогда другой вопрос, что надобно сделать, чтобы ReadFile и WriteFile не спотыкались друг об друга?