我正在尝试使用SetupDiGetDeviceInterfaceDetail函数调试一些32/64位的C# P/Invoke问题。这涉及到分析SP_DEVICE_INTERFACE_DETAIL_DATA结构。为此,我尝试编写一个简单的C++程序来查看未记录的数据。我的C语言技能不足以从定义中读取结构大小。
下面是使用Visual Studio2017创建的一个新的C++ Windows控制台应用程序的代码:
#include "pch.h"
#include <iostream>
#include <Setupapi.h>
int main()
{
std::cout << "Size: " << sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) << "\n";
}一旦我添加了第三个include,我就得到了关于微软文件中语法错误的1600+编译器错误-缺少分号,类型说明符和其他东西,分布在几个文件中,比如setupapi.h,prsht.h,dpa_dsa.h或commctrl.h。这完全超出了我的能力范围。看起来微软把事情搞得一团糟。如果C++编程总是这样,我想知道Visual Studio是如何编译的。
这是怎么回事?为什么我不能像文档中建议的那样包含那个头文件呢?
有没有其他方法可以找出该sizeof表达式将解析成什么?
发布于 2019-12-21 07:05:15
下面是一个固定的版本:
#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 ];
}长度因数据而异。
https://stackoverflow.com/questions/59432077
复制相似问题