Sự khác biệt giữa ứng dụng Windows và Console


39

Có sự khác biệt nào giữa các ứng dụng Windows và Console?

Khi tạo một dự án mới trong Visual C++, nó yêu cầu chọn một trong hai bên trên.

62

Sự khác biệt duy nhất là ứng dụng bảng điều khiển luôn sinh ra một giao diện điều khiển nếu nó không được khởi động từ bàn điều khiển (hoặc bảng điều khiển được kích hoạt khi khởi động). Một ứng dụng cửa sổ, mặt khác, không sinh ra một giao diện điều khiển. Điện thoại có thể vẫn được đính kèm với bảng điều khiển hiện có hoặc tạo bảng điều khiển mới bằng cách sử dụng AllocConsole.

Điều này làm cho các ứng dụng Windows phù hợp hơn cho các ứng dụng GUI hoặc các ứng dụng nền vì bạn thường không muốn tạo cửa sổ đầu cuối cho các ứng dụng đó.

Trên lưu ý kỹ thuật hơn, sự khác biệt duy nhất giữa Bảng điều khiển và tệp thực thi Windows là một byte trong tiêu đề PE của tệp exe. Việc chuyển đổi byte này theo cách thủ công (ví dụ: sử dụng trình chỉnh sửa hex) sẽ chuyển đổi loại ứng dụng. Đây là một hack được công bố tốt, được sử dụng để tạo ra các ứng dụng giao diện điều khiển trong VB6 (nơi mà loại ứng dụng này không được hỗ trợ rõ ràng).

Để xác định và thay đổi loại hệ thống con của ứng dụng, bạn cần phải đọc các phần của tiêu đề PE. Tuy nhiên, địa chỉ của dữ liệu hệ thống phụ không cố định vì nó là một phần của tiêu đề tệp tùy chọn có vị trí được xác định bởi một địa chỉ được lưu trữ trong tiêu đề tệp DOS (trong thành viên e_lfanew). Địa chỉ này thực sự trỏ đến bản ghi _IMAGE_NT_HEADERS, lần lượt, bao gồm cấu trúc IMAGE_OPTIONAL_HEADER32. Điều này có int161) thành viên được gọi là Subsystem. Giá trị của thành viên là 2 cho một ứng dụng Windows và 3 cho một ứng dụng giao diện điều khiển. Các hệ thống phụ khác tồn tại (đặc biệt là POSIX và hạt nhân). Tôi đã viết một ứng dụng VB6 nhỏ để thay đổi hệ thống con của một ứng dụng, có thể được tải xuống từ ActiveVB dưới dạng mã nguồn.

Định dạng PE không được tài liệu tốt lắm nhưng tài liệu này có thể dùng làm giới thiệu: Peering Inside the PE: A Tour of the Win32 Portable Executable File Format.


1) này không thực sự mâu thuẫn với tuyên bố của tôi rằng chỉ có một byte khác: byte quan trọng nhất của thành viên này luôn luôn là 0. Chỉ có ít nhất byte thay đổi đáng kể.

  0

Cảm ơn Konrad - tuyệt vời :-) 22 feb. 092009-02-22 13:24:33

  0

@Rakesh, bạn nên chấp nhận giải pháp của mình nếu bạn thích nó, nó là V nhỏ bên cạnh câu trả lời. 22 feb. 092009-02-22 13:27:07

  0

@Olafur, bạn có thể vui lòng cho tôi biết ý nghĩa của giá trị '4' ngay phía trên V nhỏ bên cạnh câu trả lời không? 22 feb. 092009-02-22 13:29:21

  0

đó là số "Phiếu bầu" - 4 người (5 giờ) đã bỏ phiếu ủng hộ câu trả lời này. 22 feb. 092009-02-22 13:36:16

  0

'2' bên cạnh câu hỏi được hỏi là gì? 22 feb. 092009-02-22 13:39:15

  0

Không có sự khác biệt trong các DLL tham chiếu? 22 feb. 092009-02-22 13:40:13

  0

@Rakesh - Không có upvotes cho câu hỏi của bạn 22 feb. 092009-02-22 13:40:39

  0

@SoapBox: xem câu trả lời được cập nhật. Địa chỉ không cố định, nó phải được tính toán. Tôi đã đăng một liên kết đến một số mã VB6 để đọc dữ liệu này. Bài viết MSDN cũng cho thấy làm thế nào để làm điều này. 22 feb. 092009-02-22 16:15:27

  0

Cha tôi thường chỉ thay thế trình liên kết bằng một chương trình tùy chỉnh đã thay đổi dòng lệnh của trình liên kết trong tệp thích hợp và sau đó chạy trình liên kết thực tế trên đó. Kết quả cuối cùng cũng giống như chuyển đổi byte trong tệp thực thi, tất nhiên :) 31 may. 132013-05-31 05:10:53


1

Ứng dụng Console chạy từ một dòng lệnh cửa sổ (start/run/cmd)

Một ứng dụng Window được cài sẵn, do đó bạn có thể lập trình một ứng dụng GUI chạy trong môi trường Windows.


15

Bên cạnh sự khác biệt được đề cập bởi Konrad, giao diện điều khiển và các ứng dụng Windows hành xử khác nhau khi được gọi là tương tác từ dấu nhắc lệnh:

Khi bạn khởi động một ứng dụng giao diện điều khiển, cửa sổ lệnh không trả lại cho đến khi thoát console ứng dụng. Khi bạn khởi động ứng dụng windows, lệnh sẽ trả về ngay lập tức.

Điều này không đúng đối với các tệp lô; họ sẽ luôn đợi cho đến khi ứng dụng thoát. (Bạn luôn có thể sử dụng lệnh start để bắt đầu một ứng dụng mà không cần chờ đợi.)


2

Sự khác biệt là cách ứng dụng được phân tích. Khi bạn sử dụng mẫu bảng điều khiển, bạn có một nhánh sẽ được kích hoạt trong bảng điều khiển. Nếu bạn đã chạy trong một giao diện điều khiển, nó bỏ qua cuộc gọi để quay một lên.

Bằng cùng một mã thông báo, ứng dụng cửa sổ được thiết kế với biểu mẫu mặc định. Nếu bạn muốn xóa nó ra, bạn có thể tạo một ứng dụng Windows Forms vô hình mà chủ yếu là một ứng dụng giao diện điều khiển không có một cửa sổ giao diện điều khiển.

Theo như sự can đảm của ứng dụng, chúng cơ bản giống nhau. Sự khác biệt chính được thêm vào ở giai đoạn biên dịch.


1

nhắn Vòng cũng là một trong những sự khác biệt:

http://en.wikipedia.org/wiki/Message_loop_in_Microsoft_Windows


2

Bạn có thể thay đổi các hệ thống con với EDITBIN.exe (MSDN Entry on EDITBIN.exe)