2013-01-12 52 views
1

當我從MSDN documentation on Windows Data Types明白,一個HWND相當於void*分配的任意地址到HWND

HWND - 一個句柄的窗口。這種類型在WinDef.h中聲明如下:typedef HANDLE HWND; 手柄 - 一個對象的句柄。這種類型在WinNT.h中聲明如下:typedef PVOID HANDLE; PVOID - 指向任何類型的指針。這種類型在WinNT.h中聲明如下:typedef void * PVOID;

但是,如果我嘗試以下方法:

int foo; 
HWND bar = &foo; 

我的編譯器(VS2012)抱怨:

error C2440: '=' : cannot convert from 'int *' to 'HWND' 
Types pointed to are unrelated; conversion requires reinterpret_cast, 
C-style cast or function-style cast 

我想不通的原因所在。我已經確定,因爲下面編譯罰款它不涉及到使用類型定義的:

typedef void* MyType; 
int foo; 
MyType bar = &foo; 

什麼阻止我指定的任意對象的地址到HWND

我想這樣做的原因,如果有人反對我試圖做到這一點,是我有一些代碼涉及HWND s,我想通過提供HWND s與已知的單元測試我可以測試的值。

+0

爲什麼想要的東西分配給HWND變量這顯然不是窗口的句柄? – selbie

+1

@selbie我已經在我的問題的最後一段回答了這個問題。 – JBentley

回答

8

如果在編譯期間定義了STRICT,則HWND被定義爲指向虛擬結構而不是void*的指針。

STRICT被添加的原因之一是使編譯器能夠捕獲您想要執行的隱式轉換類型(而許多人確實沒有)。由於您實際上需要「寬鬆檢查」,因此請確保STRICT未定義。

或者只是施放。

(注意MSDN文檔頁面上您鏈接的評論通過yic81以表明它需要一些更新)

+0

謝謝。我試圖更多地瞭解STRICT - 這是一個特定的Windows事物嗎?我在MSDN上發現的對它的引用只談到'HANDLE's和類似的東西。 – JBentley

+2

'STRICT'只是很久以前在WinSDK中引入的一個宏,用於在SDK頭中配置更嚴格的類型檢查。例如,不是所有句柄都是相同的'void *'類型,它們變成指向不同類型的指針,因此編譯器可以檢查是否錯誤地使用了另一種類型的句柄。例如,如果沒有'STRICT','HWND'與'HBITMAP'的類型相同,所以如果你傳遞一個'HBITMAP'的'HWND',編譯器就不會抱怨。 'STRICT'修復了這個問題。有關詳細信息,請參閱http://support.microsoft.com/kb/83456。 –

1

嘗試

int foo; 
HWND bar = (HWND)&foo;