2012-05-25 23 views
6

sự khác biệt chính giữa hai là gì? Tôi sẵn sàng chỉ chạy một EXE khác từ ứng dụng (C++) của tôi. Có bất kỳ sự khác biệt nào khi kế thừa môi trường, tính năng bảo mật, v.v ... không?CreateProcess và ShellExecute sự khác biệt

+1

Các [MSDN docs] (http://msdn.microsoft.com) cung cấp cho bạn thông tin này. Câu hỏi này hoàn toàn quá mơ hồ và không dành riêng cho SO. Có hàng tá câu hỏi thảo luận cả hai, và bạn đã hoàn toàn không có nỗ lực nào để tự mình nghiên cứu. (Như một gợi ý: Chỉ một cho phép bạn chỉ định bất cứ điều gì về môi trường, kế thừa xử lý và thông tin khác. Tôi sẽ để nó vào khả năng nghiên cứu của bạn để tìm ra cái nào.) –

Trả lời

11

Sự khác biệt chính giữa CreateProcessShellExecute như sau: CreateProcess được định hướng thêm về mức độ thấp và ShellExec trên đòn bẩy sử dụng cao mà thấy người sử dụng trong thám hiểm.

Ví dụ sử dụng CreateProcess, người dùng có thể sử dụng dòng lệnh dài hơn MAX_PATH. Nó có 32.768 ký tự hạn chế. Bạn cũng có thể sử dụng CreateProcess để bắt đầu chương trình (nếu bạn có đủ quyền) trên một cửa sổ khác như trên màn hình đăng nhập.

Ví dụ khác. Bạn có thể sử dụng ShellExecute để bắt đầu Bảng điều khiển hoặc mở bất kỳ chương trình nào đã tồn tại trên máy tính để chỉnh sửa JPG được gửi ví dụ. Vì vậy, bạn làm việc với ShellExecute gần với các hành động tương ứng trong Windows Explorer.

+0

CreateProcess không thể bắt đầu quá trình nếu đường dẫn đến chương trình vượt quá MAX_PATH. Nó có thể truyền các đối số dài cho một chương trình có thể được bắt đầu, nhưng đó là khác nhau. Về cơ bản không có cách nào để bắt đầu một chương trình nằm sâu hơn MAX_PATH (trừ khi có một số tương đương ngắn 8,3) – nikos

+0

@nikos: Người ta có thể sử dụng cả 'lpApplicationName' và' lpCommandLine' để chỉ định chương trình với các tham số. Độ dài tối đa của 'lpCommandLine' được giới hạn trong 32.768 ký tự. Bạn có thể đọc trong [tài liệu] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx) rằng "Nếu lpApplicationName là NULL, tên mô-đun một phần của lpCommandLine được giới hạn trong MAX_PATH ký tự. ". Bằng cách sử dụng cả hai không 'NULL lpApplicationName' và' lpCommandLine' nên có thể xác định một phần mô-đun có chiều dài lớn hơn là MAX_PATH. Tôi nghĩ rằng một trong những nên sử dụng "\\? \" Tiền tố trong đường dẫn – Oleg

+0

@nikos: Hơn nữa, bắt đầu từ Windows 10, phiên bản 1607, MAX_PATH hạn chế đã được gỡ bỏ từ các tập tin Win32 chung và chức năng thư mục (xem [thông báo ban đầu] (https : //mspoweruser.com/ntfs-260-character-windows-10/) và [tài liệu] (https: // msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath)). – Oleg

4

Sự khác biệt chính là linh hoạt. ShellExecute dễ sử dụng hơn nhưng không có nhiều tính linh hoạt. CreateProcess là một cơn đau để sử dụng, nhưng cho phép bạn làm bất cứ điều gì.

Ví dụ: với CreateProcess, bạn có thể chỉ định các chốt (đường ống hoặc tệp) để sử dụng cho luồng đầu vào/đầu ra/lỗi chuẩn ở trẻ. ShellExecute không cung cấp cho bạn cách để làm điều đó. Có thể cần lưu ý rằng mặc dù ShellExecutecó thể được sử dụng để bắt đầu thực thi trực tiếp, mục đích chính của nó là "thực thi" các tệp tài liệu - ví dụ: yêu cầu nó "thực thi" a "whatever.html" và khởi động trình duyệt web mặc định của bạn và tải tệp HTML được chỉ định vào đó. Bạn cũng có thể làm điều đó bằng cách sử dụng CreateProcess, nhưng để làm điều đó, bạn (thường) bắt đầu bằng cách gọi FindExecutable để tìm chương trình được liên kết với tệp dữ liệu được đề cập, sau đó thực thi chuyển tệp dữ liệu của bạn dưới dạng tham số.

2

CreateProcess trả về xử lý và id cho quá trình bắt đầu và đó là chủ đề chính trong cơ cấu PROCESS_INFORMATION

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