2012-04-25 28 views
10

Các definition of WinMain là gì là:mục đích hPrevInstance trong WinMain

int CALLBACK WinMain(
    _In_ HINSTANCE hInstance, 
    _In_ HINSTANCE hPrevInstance, 
    _In_ LPSTR  lpCmdLine, 
    _In_ int  nCmdShow 
); 

Những gì tôi hiểu là:

Tuy nhiên, không bao giờ có tôi đi qua bất kỳ sử dụng hPrevInstance, ngay cả trong cuốn sách từ cuối những năm 1990 . Vì vậy, những gì, nếu có, là việc sử dụng hPrevInstance, và những gì chính xác nó?

Trả lời

14

Đó là một điều kế thừa. Raymond Chen cung cấp giải thích tốt về The Old New Thing (ngày 15   tháng 6   2004). Dưới đây là (với các liên kết đã sửa):

Khi chương trình GUI trung bình của bạn tự chọn lên khỏi mặt đất, kiểm soát bắt đầu tại số WinMain function của bạn. Tham số thứ hai, hPrevInstance, luôn bằng 0 trong các chương trình Win32. Chắc chắn nó có ý nghĩa tại một số điểm?

Tất nhiên là như vậy.

Trong Windows 16 bit, có một hàm gọi là GetInstanceData. Hàm này lấy một HINSTANCE, một con trỏ và một chiều dài, và bộ nhớ đã sao chép từ cá thể đó vào cá thể hiện tại của bạn. (Đó là loại tương đương 16-bit với ReadProcessMemory, với sự hạn chế rằng thông số thứ hai và thứ ba phải giống nhau.)

(Vì Windows 16 bit có một không gian địa chỉ chung, hàm GetInstanceData thực sự không có gì Win16 thực sự được thiết kế với khả năng áp đặt các không gian địa chỉ riêng biệt trong một phiên bản tương lai - quan sát các cờ như GMEM_SHARED - nhưng sự phổ biến của các thủ thuật như hmemcpy'ing ví dụ trước của bạn đã giảm tiềm năng này thành một giấc mơ chưa thực hiện.)

Đây là lý do cho tham số hPrevInstance tới WinMain. Nếu hPrevInstance không phải là NULL, thì nó là cá thể xử lý của một bản sao của chương trình đang chạy. Bạn có thể sử dụng GetInstanceData để sao chép dữ liệu từ nó, giúp bạn thoát khỏi mặt đất nhanh hơn. Ví dụ, bạn có thể muốn sao chép cửa sổ chính xử lý trong ví dụ trước để bạn có thể giao tiếp với nó.

Cho dù hPrevInstance là NULL hay không được thông báo cho bạn biết bạn có phải là bản sao đầu tiên của chương trình hay không. Trong Windows 16 bit, chỉ có phiên bản đầu tiên của một chương trình đã đăng ký các lớp của nó; trường hợp thứ hai và tiếp theo tiếp tục sử dụng các lớp đã được đăng ký bởi trường hợp đầu tiên. (Thật vậy, nếu họ đã thử, đăng ký sẽ thất bại vì lớp đã tồn tại.) Vì vậy, tất cả các chương trình Windows 16 bit bỏ qua đăng ký lớp nếu hPrevInstance không phải là NULL.

Những người thiết kế Win32 thấy mình trong một chút khắc phục khi đến lúc tới cổng WinMain: Điều gì để vượt qua cho hPrevInstance?Toàn bộ mô-đun/điều thể hiện không tồn tại trong Win32, sau khi tất cả, và không gian địa chỉ riêng biệt có nghĩa là các chương trình bỏ qua việc tái khởi động trong trường hợp thứ hai sẽ không còn hoạt động nữa. Vì vậy, Win32 luôn luôn vượt qua NULL, làm cho tất cả các chương trình tin rằng họ là người đầu tiên.

Và thật ngạc nhiên, nó thực sự hiệu quả.