古怪的VARIANT_BOOL類型
來源:互聯網
上載者:User
在進行MFC的ActiveX控制項編程時,肯定會遇到布爾型的屬性。在VC7中對應的內部類型為VARIANT_BOOL,實際上是一個short型的資料。實際使用過程中最容易碰到以下3個問題1.在控制項的DoPropExchange(CPropExchange*pPX)中需要調用PX_Bool函數,但是這個函數要求第3個參數為int型,可嚮導產生的變數就是VARIANT_BOOL型的,所以這裡是需要進行強制類型轉換的,例子如下: if(pPX->IsLoading())
{
PX_Bool(pPX, _T("CanFired"), (int&)m_CanFired,VARIANT_FALSE);
}
else
{
PX_Bool(pPX, _T("CanFired"), (int&)m_CanFired);
} 2. 在代碼的其他地方使用表示屬性的變數時該如何確定其真假 在VC中經常用BOOL來表示真假,其中1表示真,0表示假。可是m_CanFired變數由於是代表控制項的屬性的,是VARIANT_BOOL型的,它對應的關係是VARIANT_TRUE表示真(實際上是-1),VARIANT_FALSE表示假(實際上是0)。 應該怎樣判斷呢?結果可能另人大跌眼鏡,在除了DoPropExchange(CPropExchange*pPX)的其他地方,還是得用TRUE(1), FALSE(0)來表示真假。而在VB中需要用VB自身的Boolean型變數的True, False來判斷。這就是我們常說的COM語言獨立性。 3.屬性頁面的問題 在VC7(2003版)裡嚮導無法在屬性頁面裡幫你綁定變數,要手工完成DDP_Check的調用。而且還有個Bug,就是DoDataExchange(CDataExchange* pDX)中的DDP_PostProcessing(pDX)居然是放在函數第1行的,實際上應該放在最後一行。同樣,這裡CheckBox只能綁定到BOOL型變數,這裡用TRUE(1),
FALSE(0)表示真假。 另附: Windows 中BOOL變數常見的好幾種類型:小寫bool,大寫的BOOL ,還有VARIANT_BOOL 。小寫bool 的是C++ 標準定義的布爾類型, 各個編譯器處理的方式不同,Visual C++ 把bool 定為一個位元組。小寫true 和 false 也都是C++ 標準定義的關鍵字。大寫的BOOL 是Windows 裡面定義的布爾類型,實質上int, 在 windows 標頭檔面有定義:typedef int BOOL;#define TRUE 1
#define FALSE 0 VARIANT_BOOL 是COM 使用的布爾類型, 其實質上是 short 類型:typedef short VARIANT_BOOL;#define VARIANT_TRUE ((VARIANT_BOOL)-1)#define VARIANT_FALSE ((VARIANT_BOOL)0)
可以看出, 3中BOOL類型的長度不一樣,而且TRUE 和 FALSE 的值也不同,在相互轉換的時候需要注意。