我正在尝试使用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
表达式将解决的问题吗?
答案 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 ];
}
长度取决于数据。