Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Thông tin: Gọi thói quen CRT đầu ra từ một ứng dụng GUI

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:105305
TÓM TẮT
Sử dụng c lần chạy ra thói quen, chẳng hạn như printf(), từ một GUIứng dụng, nó là cần thiết để tạo ra một giao diện điều khiển. Ứng dụng Win32lập trình giao diện (API) AllocConsole() tạo ra giao diện điều khiển. CRTthường lệ setvbuf() loại bỏ việc đệm để cho đầu ra là có thể nhìn thấy ngay lập tức.

Phương pháp này hoạt động nếu ứng dụng GUI chạy từ dòng lệnh hoặctừ quản lý tập tin. Tuy nhiên, phương pháp này không hoạt động nếu ứng dụng làbắt đầu từ người quản lý chương trình hoặc thông qua lệnh "bắt đầu". Sau đâyMã cho thấy làm thế nào để làm việc xung quanh vấn đề này:
   int hCrt;   FILE *hf;   AllocConsole();   hCrt = _open_osfhandle(             (long) GetStdHandle(STD_OUTPUT_HANDLE),             _O_TEXT          );   hf = _fdopen( hCrt, "w" );   *stdout = *hf;   i = setvbuf( stdout, NULL, _IONBF, 0 );				
Mã này sẽ mở ra một mới xử lý CRT cấp thấp đến đầu ra giao diện điều khiển chính xácxử lý, kết hợp một dòng mới với đó xử lý ở độ cao thấp, và thay thếstdout với rằng dòng mới. Quá trình này sẽ chăm sóc của các chức năng sử dụngstdout, chẳng hạn như printf(), puts(), và vv. Sử dụng thủ tục tương tựstdin và stderr.

Lưu ý rằng mã này không sửa vấn đề với xử lý 0, 1 và 2. Trongthực tế, do biến chứng khác, nó không thể được sửa chữa điểm này, vàVì vậy, nó là cần thiết để sử dụng dòng I/O thay vì ở độ cao thấp I/O.
THÔNG TIN THÊM
Khi một ứng dụng GUI bắt đầu với lệnh "bắt đầu", bahệ điều hành tiêu chuẩn xử lý STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, vàSTD_ERROR_HANDLE tất cả "zeroed ra" bởi khởi tạo giao diện điều khiểnthói quen. Những xử lý ba được thay thế các giá bởi hợp lệ trị khi GUIứng dụng các cuộc gọi AllocConsole(). Vì vậy, một khi điều này được thực hiện, gọi điện thoạiGetStdHandle() sẽ luôn quay trở lại giá trị xử lý hợp lệ. Vấn đề là cóCRT đã xong khởi tạo trước khi đơn của bạn được mộtcơ hội để gọi AllocConsole(); các ba thấp I/O chốt 0, 1 và 2 cóđã được thiết lập để sử dụng bản gốc zeroed ra OS chốt, vì vậy tất cả CRTI/O được gửi đến không hợp lệ OS chốt và CRT đầu ra không xuất hiện trong cácgiao diện điều khiển. Sử dụng workaround mô tả ở trên để loại bỏ các vấn đề này.

Các vụ bắt đầu ứng dụng GUI từ dòng lệnh mà không cầnlệnh "bắt đầu", các tiêu chuẩn xử lý OS không chính xác zeroed ra,nhưng không chính xác được thừa kế từ CMD.EXE. Khi các ứng dụng của CRTinitializes, các ba thấp I/O chốt 0, 1 và 2 được khởi tạo để sử dụngnhững con số ba xử lý các ứng dụng thừa hưởng từ CMD.EXE. Khiviệc áp dụng các cuộc gọi AllocConsole(), bàn điều khiển khởi tạo thói quencố gắng để thay thế những gì khởi tạo giao diện điều khiển tin là không hợp lệhệ điều hành tiêu chuẩn xử lý các giá trị với giá trị xử lý hợp lệ từ bàn điều khiển mới. Bởitrùng hợp ngẫu nhiên, bởi vì các thói quen khởi tạo giao diện điều khiển có xu hướng để cho raba giá trị tương tự cho các tiêu chuẩn OS chốt, bàn điều khiểninitilization sẽ thay thế các giá trị tiêu chuẩn xử lý OS với cùng mộtcác giá trị mà đã có trước khi--những người thừa hưởng từ CMD.EXE. Do đó,CRT i/O hoạt động trong trường hợp này.

Nó là quan trọng để nhận ra rằng khả năng sử dụng CRT thói quen từ một GUIứng dụng chạy từ dòng lệnh không bởi thiết kế vì vậy, điều này có thể khônglàm việc trong tương lai các phiên bản của Windows NT hoặc cửa sổ. Trong một phiên bản trong tương lai, bạncó thể cần các workaround không chỉ cho các ứng dụng bắt đầu vào lệnhdòng với "bắt đầu <application name="">", mà còn cho các ứng dụng bắt đầu vàodòng lệnh với "tên ứng dụng".</application>
3.10 3,50 CRT chuyển hướng xử lý std

Cảnh báo: Bài viết này đã được dịch tự động

Thuộc tính

ID Bài viết: 105305 - Xem lại Lần cuối: 08/17/2011 14:58:00 - Bản sửa đổi: 2.0

Microsoft Win32 Application Programming Interface

  • kbconsole kbinfo kbkernbase kbmt KB105305 KbMtvi
Phản hồi