繁体   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