共用方式為


Windows 程式碼撰寫慣例

如果您不熟悉 Windows 程式設計,當您第一次看到 Windows 程式時,它可能會不憑證。 程式碼會填入奇怪的類型定義 ,例如 DWORD_PTRLPRECT,而變數的名稱如 hWndpwsz (稱為匈牙利文標記法) 。 請務必花點時間瞭解一些 Windows 程式碼慣例。

大部分的 Windows API 是由函式或元件物件模型所組成, (COM) 介面。 很少的 Windows API 會以 C++ 類別的形式提供。 (值得注意的例外狀況是 GDI+,這是其中一個 2D 圖形 API.)

Typedefs

Windows 標頭包含許多 typedef。 其中許多定義于標頭檔 WinDef.h 中。 以下是您經常會遇到的一些。

整數類型

資料類型 大小 簽署?
BYTE 8 位元 不帶正負號
DWORD 32 位元 不帶正負號
INT32 32 位元 簽署人
INT64 64 位元 簽署人
LONG 32 位元 簽署人
LONGLONG 64 位元 簽署人
UINT32 32 位元 不帶正負號
UINT64 64 位元 不帶正負號
ULONG 32 位元 不帶正負號
ULONGLONG 64 位元 不帶正負號
WORD 16 位元 不帶正負號

如您所見,這些 typedef 中有一定數量的備援。 部分重迭只是因為 Windows API 的歷程記錄。 此處列出的類型具有固定大小,且大小在 32 位和 64 應用程式中都相同。 例如, DWORD 類型一律為 32 位寬。

布林值型別

BOOLint的類型別名,不同于 C++的 bool,以及代表 布林 值的其他類型。 標頭檔 WinDef.h 也會定義兩個值,以便與 BOOL搭配使用。

#define FALSE    0 
#define TRUE     1

不過,儘管這個 TRUE的定義,傳回 BOOL 類型的大部分函式都可以傳回任何非零的值,以指出布林值。 因此,您應該一律撰寫下列專案:

// Right way.
if (SomeFunctionThatReturnsBoolean()) 
{ 
    ...
}

// or

if (SomeFunctionThatReturnsBoolean() != FALSE)
{ 
    ...
}

而不是這樣:

if (result == TRUE) // Wrong!
{
    ... 
}

BOOL 是整數類型,無法與 C++ 的 bool交換。

指標類型

Windows 會定義表單 指標對 X的許多資料類型。 這些通常會在名稱中有前置詞 P 或LP。 例如, LPRECTRECT的指標,其中 RECT 是描述矩形的結構。 下列變數宣告相等。

RECT*  rect;  // Pointer to a RECT structure.
LPRECT rect;  // The same
PRECT  rect;  // Also the same.

在 16 位架構上, (16 位 Windows) 有 2 種類型的 指標,P 代表 「指標」, 而 LP 代表「長指標」。 長指標 (也稱為 遠指標) ,才能定址目前區段以外的記憶體範圍。 LP前置詞已保留,可讓您更輕鬆地將 16 位程式碼移植到 32 位 Windows。 目前沒有任何區別,而且這些指標類型全都相等。 避免使用這些前置詞;或者,如果您必須使用一個,請使用 P

指標有效位數類型

下列資料類型一律是指標的大小,也就是 32 位應用程式中的 32 位寬,而 64 位應用程式中則為 64 位寬。 大小是在編譯時期決定。 當 32 位應用程式在 64 位 Windows 上執行時,這些資料類型仍為 4 個位元組寬。 (64 位應用程式無法在 32 位 Windows 上執行,因此不會發生反向情況。)

  • DWORD_PTR
  • INT_PTR
  • LONG_PTR
  • ULONG_PTR
  • UINT_PTR

當整數可能轉換成指標時,會使用這些類型。 它們也可用來定義指標算術的變數,以及定義迴圈計數器,以逐一查看記憶體緩衝區中的完整位元組範圍。 一般而言,它們會出現在現有 32 位值在 64 位 Windows 上展開為 64 位的位置。

匈牙利文標記法

匈牙利文標記法 是將前置詞新增至變數名稱的做法,以提供變數的其他資訊。 (標記法的) 名是匈牙利文,因此其名稱) 。

在原始形式中,匈牙利文標記法會提供變數的 語意 資訊,告知您預期的用途。 例如, i 表示索引, cb 表示位元組大小 (「位元組計數」) , 以及 rwcol 平均資料列和資料行編號。 這些前置詞是設計來避免意外在錯誤的內容中使用變數。 例如,如果您看到運算式 rwPosition + cbTable ,就會知道資料列編號已新增至大小,這幾乎是程式碼中的 Bug

更常見的匈牙利文標記法形式會使用前置詞來提供類型資訊,例如,DWORDdw和適用于WORDw

注意

C ++ 核心指導方針 不建議前置詞標記法 (例如,匈牙利文標記法) 。 請參閱 NL.5:避免名稱中的編碼類型資訊。 在內部,Windows 小組不再使用它。 但其使用仍會保留在範例和檔中。

下一個

使用字串