使用Win32 API时,要使用哪些数据类型?

时间:2014-03-20 20:40:16

标签: c++ winapi

标准数据类型或Windows数据类型?

我会使用Windows数据类型来使我的代码与Win32 API保持一致。

另一方面,我会使用标准数据类型来防止编码错误。

  1. 使用nullptr而不是NULL将防止为实际上没有采用指针类型的参数传递NULL的错误样式。
  2. 想象一下Win32 API函数,由于某些无意义的原因需要LPTSTR,但实际上会将其视为LPTCSTR。你有一个std :: string和do(LPTSTR)(s.c_str())。一切都很好,直到你切换到W版本的Win32 API函数。该程序编译因为演员阵容成功,但可能会发生一些不好的事情。如果你已经完成了(char *)(s.c_str()),编译器就会抓住它。
  3. 使用标准数据类型似乎更安全,但也感觉像是穿着白色'全黑的派对。

    这里应该做些什么?

4 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您正在进行的项目。尝试遵循已经建立的编码风格。

我最喜欢的做事方式:

  • 对于方法,我声明我使用普通数据类型(void*char*等...),当我调用它们时,我也使用它。
  • 但是对于我使用Win32 API进行的每次交互,我都要将变量声明为Win32 API样式(LPVOIDLPTSTR,...)或者如果我从其中一个获取变量我的函数(具有"普通"数据类型),但需要转到Win32 API调用,我特别强制转换为所需的类型。有时这也有助于查看我是否有一些冲突的类型。

答案 1 :(得分:1)

嗯 - 我认为winapi的常量非常好。你有什么例子吗?

但问题是:

我建议使用stdint类型为你自己的东西但是当与winAPI接口时使用它们的类型并转换为它们以避免类型宽度和混淆的困难,例如WORD的意思。

答案 2 :(得分:1)

Windows与C ++类型是Unicode安全性的完全正交问题。

如果你有std::string s,那么在编译为Unicode时,你可以做const_cast<LPSTR>(s.c_str())而不会牺牲编译器错误。

答案 3 :(得分:0)

我同意@fritzone是一个实用的解决方案。我的情况略有不同。

我非常喜欢包装外部API。我将编写一个使用WinApi的代码层,并始终在该层中使用Windows类型。这将是包含Windows.h的应用程序的唯一部分。对这些图层函数的API调用将使用我选择的类型(对于@fritzone)我将根据需要显式地将值转换为WIndows类型。每个演员都是等待发生的错误。

分层的另一个优点是它是放置跟踪代码的好地方。 WinApi可能非常繁琐且难以在调试器中单步执行,因此我希望为每个WinApi函数提供跟踪代码,如果需要可以打开它。

使用MFC或ATL更难做到,而MFC或ATL往往变得相当普遍。这是我对各种不同外部API的偏爱。