2012-12-11 83 views
1

據我所知,HANDLE只是一個涉及某種「系統資源表」的數字。這個句柄常量是否正確?我想不是因爲它只是用來像數組上的索引那樣訪問表。一個位圖的例子:雖然HBITMAP被聲明爲const,但我可以更改位圖的內容嗎?是一個const HANDLE真的是const嗎?

+2

API函數是否使用'const HBITMAP'或者只是一個'HBITMAP'?這應該回答你的問題。如果是後者,那麼不要費神地將其聲明爲'const'(無論如何,你最終只會拋棄const)。另外,'HANDLE'可能不僅僅是一個數字,它可能是一個不透明的類型指針,它直接指向一些已分配的資源,而沒有任何表之間的轉換。最好不要對這種不透明類型做出假設。 – Praetorian

+3

一個HANDLE總是指同一個操作系統對象。其狀態可能肯定會發生變化,如位圖或互斥體。所以它是一個'foo const *',而不是'const foo *'。 –

回答

3

HANDLE is(AFAIR)int的typedef,因此常量HBITMAP與const int相同。

在這個意義上,你可以改變的位圖的內容,即使處理位圖是常量,因爲常量是指手柄不實際的位圖(認爲它是一個const指針變量的類。)

但是:

  • 句柄是在Win32 API,它是一個C API而不是C++(和創建前的C獲得常量)的特點:因爲

    你的問題反正沒有實際意義。

  • 無論如何您都不能直接更改位圖(或由句柄表示的任何其他「對象」)。該句柄是對Win32結構的不透明引用,並且只能通過用於處理(無雙關語)對象的相應Win32 API調用進行操作。

我把「對象」加上引號,因爲把手指概念對象(概念軟件表示),而不是實際的C++對象,又因爲Win32的是一個C API。

+0

呼籲對「對象」的引用。在處理句柄時,最好將它們視爲具有訪問它們的方法的函數的黑盒子。 – RonaldBarzell

+1

'HANDLE'是一個'void *'(儘管它可能在Window歷史的某個時刻是某種'int')。其他句柄(如HBITMAP)是指向某些結構類型的指針,如果定義了STRICT,如果STRICT沒有被定義,它們只是'HANDLE'的一個typedef。 –

+0

@Michael謝謝,我目前沒有SDK。將typedef設置爲void *是有意義的,因爲int在64位窗口中仍然是32位。 –

相關問題