tft每日頭條

 > 科技

 > 關于WinMain函數的第二個參數解釋

關于WinMain函數的第二個參數解釋

科技 更新时间:2024-11-25 23:24:03
請牢記:hPrevInstance始終為空

當一個GUI應用程序開始運行時,控制流會從WinMain函數開始。它的第二個參數,hPrevInstance,在Win32應用程序中永遠為0。這個參數有什麼特殊之處嗎?

當然有。

在早期的16位Windows時代,曾經有一個名叫GetInstanceData的API函數。這個函數有一個HINSTANCE參數,一個指針,一個長度參數,以及一塊用于拷貝實例到當前實例的内存塊。(它有點類似16位版本的ReadProcessMemory,隻是會有個第二個和第三個參數必須相同的限制)

因為16位Windows有一個共享的地址空間,GetInstanceData實際上就相當于hmemcpy的操作,許多程序會依賴這個原理,并使用原始的hmemcpy,而不是文檔化的API。

Win16實際上被設計為可以在将來使用獨立的地址空間,你會發現有類似GMEM_SHARED這樣的标志,但是類似使用hmemcpy拷貝之前的實例這種方法被大量使用,使這種潛力變成了無法實現的夢想。

這就是為什麼在設計WinMain函數時會添加一個hPrevInstance參數的原因。如果hPrevInstancehPrevInstance非空,則它表明當前實例是從一個已經運行的實例中拷貝過來的。你可以使用GetInstanceData來從中拷貝數據,然後進行快速的啟動。

舉個例子,你可能想從前一個實例中拷貝主窗口句柄,這樣就可以和它進行通信了。通過判斷hPrevInstance是否為空,可以知道當前是否運行的是程序的第一個實例。在16位Windows中,隻有應用程序的第一個實例會注冊窗口類,而後續的實例僅僅會使用在第一個實例中注冊的窗口類,而不會重新注冊。(當然了,如果後續實例還是嘗試注冊,也會失敗,因為目标窗口類已經存在于系統中了)

因此,當hPrevInstance為非空的時候,所有16位Windows應用程序會跳過窗口類的注冊過程。Win32的設計者在嘗試移植WinMain的時候,碰到這樣一個問題:應該向hPrevInstance參數傳遞什麼值?畢竟,Win32中不存在16位系統中的那些有關模塊,實例的概念。而32位系統中,每個應用程序都有獨立的地址空間,所以那些跳過初始化的後續實例不會正常工作。

所以,在Win32中,系統始終向hPrevInstance傳遞NULL值,這樣,所有應用程序都會相信自己是第一個實例,這樣,所有的初始化操作就不會被跳過了。

總結

奇迹般地,這個小技巧确實行得通。

最後

Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,裡面有很多關于Windows的小知識,對于廣大Windows平台開發者來說,确實十分有幫助。本文來自:《What was the purpose of the hPrevInstance parameter to WinMain?》

關于WinMain函數的第二個參數解釋(關于WinMain函數的第二個參數解釋)1

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved