簡體   English   中英

使用Win32 API時,要使用哪些數據類型?

[英]When using the Win32 API, which data types to use?

標准數據類型還是Windows數據類型?

我將使用Windows數據類型使我的代碼與Win32 API一致。

另一方面,我將使用標准數據類型來防止編碼錯誤。

  1. 使用nullptr而不是NULL可以避免為實際上不采用指針類型的參數傳遞NULL的不良方式。
  2. 想象一下一個Win32 API函數,出於某種廢話,它使用LPTSTR,但實際上會將其視為LPTCSTR。 您有一個std :: string,然后執行(LPTSTR)(s.c_str())。 一切正常,直到您切換到Win32 API函數的W版本。 該程序之所以編譯是因為強制轉換成功,但是可能會發生一些不良情況。 如果您已完成(char *)(s.c_str()),則編譯器將捕獲此錯誤。

使用標准數據類型似乎更安全,但也感覺像是全黑的“穿白色衣服”聚會。

在這里應該決定什么?

這在很大程度上取決於您正在處理的項目。 嘗試遵循已經建立的編碼樣式。

我最喜歡的做事方式:

  • 對於方法,我聲明我使用普通的數據類型( void*char*等),當我調用它們時,我也使用此類型。
  • 但是,對於與Win32 API進行的每次交互,我要么將變量聲明為Win32 API樣式( LPVOIDLPTSTR ,...),要么從我的一個函數(具有“正常”數據類型)獲取變量。 ,但需要轉到Win32 API調用,我專門將類型轉換為所需的類型。 有時這也有助於查看我是否有一些沖突的類型。

嗯-我認為winapi的穩定性很好。 你有例子嗎?

但對您的問題:

我建議為您自己的東西使用stdint類型, 但是當與winAPI接口時,請使用它們的類型並相互之間進行轉換,以避免有關類型寬度和混淆的麻煩,例如WORD的意思。

Windows vs C ++類型是與Unicode安全完全正交的問題。

如果您具有std::string s ,則可以很好地進行const_cast<LPSTR>(s.c_str())而不犧牲以Unicode編譯時的編譯器錯誤。

我同意@fritzone作為實用的解決方案。 我的略有不同。

我非常希望包裝外部API。 我將編寫一個代碼層,在其中使用WinApi,並始終在該層中使用Windows類型。 這將是包含Windows.h的應用程序的唯一部分。 調用這些層函數的API將使用我選擇的類型,並且(對於@fritzone)我將根據需要將值顯式轉換為WIndows類型。 每個演員表都是一個等待發生的錯誤。

分層的另一個好處是,它是放置跟蹤代碼的好地方。 WinApi可能非常健談,並且很難在調試器中逐步調試,因此我喜歡為每個WinApi函數提供跟蹤代碼,可以在需要時打開它們。

使用MFC或ATL變得越來越普遍,這很難做到。 對於各種不同的外部API,這一直是我的偏愛。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM