ข้อมูล: เรียกตามปกติ CRT ออกจากแอพลิเคชันของ GUI

การแปลบทความ การแปลบทความ
หมายเลขบทความ (Article ID): 105305 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

สรุป

เมื่อต้องการใช้เวลาเรียกใช้ C ผลลัพธ์ตามปกติ เช่น printf() จากโปรแกรมประยุกต์ GUI คือคุณจำเป็นต้องสร้างคอนโซล เฟซ Win32 เขียนโปรแกรมของโปรแกรมประยุกต์ (API) AllocConsole() สร้างคอนโซล setvbuf() ตามกำหนดเวลาของ CRT เอาการกำหนดบัฟเฟอร์เพื่อให้แสดงผลจะมองเห็นได้ในทันที

วิธีนี้ทำงานหากมีรันโปรแกรมประยุกต์ GUI จากบรรทัดคำสั่ง หรือจากตัว จัดการแฟ้ม อย่างไรก็ตาม วิธีการนี้ไม่ทำงานหากมีเริ่มโปรแกรมประยุกต์จากตัว จัดการโปรแกรม หรือโดย ใช้คำสั่ง "เริ่ม" รหัสต่อไปนี้แสดงวิธีการแก้ปัญหานี้:
   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 );
				
รหัสนี้เปิดขึ้นแบบใหม่ระดับต่ำ CRT จัดการกับหมายเลขอ้างอิงผลลัพธ์ของคอนโซลที่ถูกต้อง เชื่อมโยงกระแสข้อมูลใหม่ ด้วยหมายเลขอ้างอิงที่ระดับต่ำ และแทนที่ stdout ด้วยกระแสข้อมูลนั้นใหม่ กระบวนการนี้ใช้เวลาภายใต้ดูแลของฟังก์ชันที่ใช้ stdout เช่น printf(), puts() และ forth อื่น ๆ ใช้ขั้นตอนเดียวกันสำหรับ stdin และ stderr

โปรดสังเกตว่า โค้ดนี้ไม่สามารถแก้ไขปัญหาเกี่ยวกับการจัดการกับ 0, 1 และ 2 ใน fact เนื่องจากการ complications อื่น ไม่สามารถแก้ไขนี้ และดังนั้น จึงเป็นจำเป็นต้องใช้การสตรีม I/O แทน I/O ระดับต่ำ

ข้อมูลเพิ่มเติม

เมื่อโปรแกรมประยุกต์ที่ GUI เริ่ม ด้วยการ "เริ่ม"คำสั่ง ระบบปฏิบัติการมาตรฐานสามจัดการ STD_INPUT_HANDLE, STD_OUTPUT_HANDLE และ STD_ERROR_HANDLE อยู่ทั้งหมด" zeroed ออก" โดยตามปกติการเตรียมใช้งานของคอนโซล จับสามเหล่านี้จะถูกแทนที่ ด้วยค่าที่ถูกต้องเมื่อโปรแกรมประยุกต์ GUI เรียก AllocConsole() ดังนั้น ทันทีซึ่งจะดำเนินการ เรียก GetStdHandle() จะเสมอกลับค่าหมายเลขอ้างอิงที่ถูกต้อง ปัญหาคือ ว่า CRT ที่แล้วเสร็จการเตรียมใช้งานก่อนที่โปรแกรมประยุกต์ของคุณได้รับโอกาสในการเรียก AllocConsole() แบบสามระดับต่ำ I/O จับ 0, 1 และ 2 ได้ถูกเซ็ตอัพใช้ดั้งเดิม zeroed ออกจากระบบปฏิบัติการจัดการ ดังนั้น I/O CRT ทั้งหมดถูกส่งไปยังจุดจับของระบบปฏิบัติการที่ไม่ถูกต้อง และผลผลิต CRT ไม่ปรากฏในคอนโซล ใช้วิธีแก้ปัญหาที่อธิบายข้างต้นเพื่อกำจัดปัญหานี้

ในกรณีของเริ่มต้นโปรแกรมประยุกต์ GUI จากบรรทัดคำสั่งโดยไม่มีคำสั่ง "เริ่ม" จัดการกับมาตรฐานของระบบปฏิบัติไม่ถูกต้อง zeroed ออก แต่ไม่ถูกต้องสืบทอดมาจาก CMD.EXE เมื่อ CRT ของโปรแกรมประยุกต์ต้น ที่สามต่ำ I/O จับ 0, 1 และ 2 ถูกเตรียมใช้งานการใช้หมายเลขของหมายเลขอ้างอิงที่สามที่โปรแกรมประยุกต์ที่สืบทอดจาก CMD.EXE เมื่อโปรแกรมประยุกต์ที่เรียก AllocConsole() ตามปกติการเตรียมใช้งานของคอนโซลพยายามแทนการเริ่มต้นส่วนควบคุม believes จะ ไม่ถูกต้องของระบบปฏิบัติการจัดการค่ามาตรฐาน ด้วยค่าหมายเลขอ้างอิงที่ถูกต้องจากคอนโซลใหม่ โดย coincidence เนื่องจากตามปกติการเตรียมใช้งานของคอนโซลแตกให้หาค่าที่สามเดียวกันสำหรับการจัดการมาตรฐานของระบบปฏิบัติการ initilization คอนโซลจะแทนค่าแฮนเดิลของค่ามาตรฐานของระบบปฏิบัติการ ด้วยค่าเดียวกันที่มีอยู่ก่อน--ตัวสืบทอดมาจาก CMD.EXE ทำงานดังนั้น CRT I/O ได้ในกรณีนี้

มีความสำคัญพบว่า ความสามารถในการใช้ตามปกติ CRT จากโปรแกรมประยุกต์ GUI ที่เรียกใช้จากบรรทัดคำสั่งไม่ โดยการออกแบบเพื่อนี้อาจไม่ทำงานในอนาคตรุ่นของ Windows NT หรือ Windows ในเวอร์ชันในอนาคต คุณอาจต้องการแก้ปัญหาสำหรับโปรแกรมประยุกต์เริ่มต้นบนบรรทัดคำสั่งที่มีไม่เพียง "เริ่ม <application name="">", แต่ยัง สำหรับโปรแกรมประยุกต์บนบรรทัดคำสั่ง "ชื่อของแอพลิเคชัน" การเริ่มต้นได้</application>

คุณสมบัติ

หมายเลขบทความ (Article ID): 105305 - รีวิวครั้งสุดท้าย: 12 ตุลาคม 2553 - Revision: 2.0
ใช้กับ
  • Microsoft Win32 Application Programming Interface เมื่อใช้กับ:
    • Microsoft Windows 98 Standard Edition
    • Microsoft Windows Millennium Edition
Keywords: 
kbconsole kbinfo kbkernbase kbmt KB105305 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:105305

ให้ข้อเสนอแนะ

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com