在Hello World应用程序中包含setupapi.h时发生编译器错误

时间:2019-12-20 22:47:28

标签: c++ visual-studio

我正在尝试使用SetupDiGetDeviceInterfaceDetail函数调试一些32/64位的C#P / Invoke问题。这涉及分析SP_DEVICE_INTERFACE_DETAIL_DATA结构。为此,我尝试编写一个简单的C ++程序以查看未记录的数据。我的C语言技能不足以从定义中读取结构尺寸。

以下是使用Visual Studio 2017创建的新C ++ Windows控制台应用程序的代码:

#include "pch.h"
#include <iostream>
#include <Setupapi.h>

int main()
{
    std::cout << "Size: " << sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) << "\n";
}

一旦添加第三个include,我就会收到1600多个有关Microsoft文件中语法错误的编译器错误-缺少分号,类型说明符和其他内容,分布在setupapi.h,prsht.h,dpa_dsa.h等多个文件中或commctrl.h。这完全超出了我的能力范围。看起来微软提供了一个巨大的烂摊子。想知道如果C ++编程总是这样的话,Visual Studio是如何编译的。

这是怎么了?为什么我不能只按文档中的建议包含该头文件?

还有另一种方法来找出该sizeof表达式将解决的问题吗?

1 个答案:

答案 0 :(得分:1)

这是固定版本:

#include <iostream>
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <Setupapi.h>

int main()
{
    std::cout << "Size: " << sizeof( SP_DEVICE_INTERFACE_DETAIL_DATA ) << "\n";
}

它打印出6,但是事实并非如此,不幸的是,该结构是可变长度的。定义如下:

#define ANYSIZE_ARRAY 1
struct SP_DEVICE_INTERFACE_DETAIL_DATA_W
{
    DWORD  cbSize;
    WCHAR  DevicePath[ ANYSIZE_ARRAY ];
}

长度取决于数据。