UseShellExecuteคุณสมบัติบูลเป็นเรื่องที่เกี่ยวข้องกับการใช้หน้าต่างShellExecuteฟังก์ชั่นครับCreateProcessฟังก์ชั่น - คำตอบสั้น ๆ ก็คือว่าถ้าUseShellExecuteเป็นจริงแล้วProcessชั้นจะใช้ฟังก์ชั่นมิฉะนั้นจะใช้ShellExecuteCreateProcess
คำตอบที่ยาวกว่าคือShellExecuteฟังก์ชันนี้ใช้เพื่อเปิดโปรแกรมหรือไฟล์ที่ระบุโดยประมาณเท่ากับการพิมพ์คำสั่งที่จะเรียกใช้ในกล่องโต้ตอบการเรียกใช้และคลิกตกลงซึ่งหมายความว่าสามารถใช้เพื่อ (ตัวอย่าง):
- เปิดไฟล์. html หรือเว็บโดยใช้เบราว์เซอร์เริ่มต้นโดยไม่จำเป็นต้องรู้ว่าเบราว์เซอร์นั้นคืออะไร
- เปิดเอกสารคำโดยไม่จำเป็นต้องรู้ว่าเส้นทางการติดตั้งสำหรับ Word คืออะไร
- เรียกใช้คำสั่งใด ๆ บนไฟล์
PATH
ตัวอย่างเช่น:
Process p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.FileName = "www.google.co.uk";
p.Start();
ใช้งานง่ายมากใช้งานได้หลากหลายและทรงพลัง แต่มาพร้อมกับข้อบกพร่องบางประการ:
ไม่สามารถเปลี่ยนเส้นทางที่จับอินพุต / เอาต์พุต / ข้อผิดพลาดมาตรฐานได้
เป็นไปไม่ได้ที่จะระบุตัวบ่งชี้ความปลอดภัย (หรือสิ่งที่น่าสนใจอื่น ๆ ) สำหรับกระบวนการย่อย
มีความเป็นไปได้ที่จะทำให้เกิดช่องโหว่ด้านความปลอดภัยหากคุณตั้งสมมติฐานเกี่ยวกับสิ่งที่จะเรียกใช้จริง:
// If there is an executable called "notepad.exe" somewhere on the path
// then this might not do what we expect
p.StartInfo.FileName = "notepad.exe";
p.Start();
CreateProcessเป็นวิธีเริ่มต้นกระบวนการที่แม่นยำกว่ามาก - ไม่ค้นหาเส้นทางและอนุญาตให้คุณเปลี่ยนเส้นทางอินพุตหรือเอาต์พุตมาตรฐานของกระบวนการย่อย (เหนือสิ่งอื่นใด) อย่างไรก็ตามข้อเสียCreateProcessคือไม่มี 3 ตัวอย่างที่ฉันให้ไว้ข้างต้นจะใช้งานได้ (ลองใช้ดู)
โดยสรุปคุณควรตั้งค่าUseShellExecuteเป็นเท็จถ้า:
- คุณต้องการเปลี่ยนเส้นทางอินพุต / เอาต์พุต / ข้อผิดพลาดมาตรฐาน (นี่คือสาเหตุที่พบบ่อยที่สุด)
- คุณไม่ต้องการค้นหาเส้นทางสำหรับปฏิบัติการ (เช่นเพื่อเหตุผลด้านความปลอดภัย)
ในทางกลับกันคุณควรรักษาUseShellExecuteความจริงไว้หากคุณต้องการเปิดเอกสาร URL หรือไฟล์แบตช์ ฯลฯ ... แทนที่จะต้องระบุเส้นทางไปยังไฟล์ปฏิบัติการอย่างชัดเจน
processStartInfo.RedirectStandardOutput=trueprocess.Arguments= "cmd /c dir >c:\\crp\\a.a"ในทำนองเดียวกันจากกล่องโต้ตอบการเรียกใช้คุณสามารถทำได้cmd /c dir>c:\crp\a.a