2011-09-25 38 views
5

Tôi muốn gọi _popen để nhận kết quả từ tệp thực thi nhưng nó đã bị xóa.Đường ống chương trình sử dụng WriteConsole

Tôi đã xem trình gỡ lỗi và phát hiện chương trình sử dụng Kernel32.WriteConsoleW để viết chuỗi unicode vào bảng điều khiển, thay vì sử dụng stdout.

Làm cách nào để chụp?

+0

Bất cứ ai cũng biết nếu tôi có thể chuyển hướng tay cầm của quy trình con và gọi ReadConsole trên đó? – user202987

Trả lời

0

Bạn sẽ có thể chuyển hướng đầu ra của một tiến trình con.

Có một cái nhìn tại Creating a Child Process with Redirected Input and Output

Bên cạnh đó ứng dụng có thể sử dụng STD_ERROR_HANDLE thay vì STD_OUTPUT_HANDLE.

+1

Làm việc trên các giải pháp lộn xộn nhất, lộn xộn nhất từng dựa trên liên kết này. Cảm ơn. Về cơ bản tôi đang làm hệ thống ("cls") sau đó sử dụng CreateProcess cho quá trình con của stdout của cha mẹ, sau đó sử dụng ReadConsoleOutputW và xây dựng lại kết quả ra khỏi đó. – user202987

1

Giải pháp quá mức: chặn cuộc gọi tới WriteConsoleW bằng cách móc vào ứng dụng khi bắt đầu. Có lẽ không phải những gì bạn đang tìm kiếm, và tôi chắc chắn có một cách dễ dàng hơn. Nhưng nó sẽ hoạt động chắc chắn :)

3

Bất kỳ đầu ra nào được tạo bằng WriteConsole sẽ không được ghi vào ống chuyển hướng. Nếu một tay cầm vào một đường ống hoặc một tập tin hay bất cứ thứ gì khác ngoài bàn điều khiển được gán cho WriteConsole, nó sẽ thất bại với ERROR_INVALID_HANDLE (6).

Từ High-Level Console Input and Output Functions trên MSDN:

ReadConsole và WriteConsole chỉ có thể được sử dụng với giao diện điều khiển xử lý; ReadFile và WriteFile có thể được sử dụng với các tay cầm khác (chẳng hạn như các tập tin hoặc đường ống). ReadConsole và WriteConsole thất bại nếu được sử dụng với một tay cầm tiêu chuẩn đã được chuyển hướng và không còn là một bàn điều khiển xử lý.

Các vấn đề liên quan