1

winapi 中的一些结构在每个 windows 版本中都有额外的成员。

typedef struct MyStruct
{
 int cbSize;
 int a;
 int b;
 #if _WIN32_WINNT >= 0x0600
 int c;
 int d;
 #endif 
} MyStruct, *PMyStruct;

当我将此移植到 C# 时,可以定义所有成员 (cbsize,a,b,c,d) 并将结构作为参数传递给某个 pinvoked 函数,还是应该为 XP 定义一个较小的结构?

4

1 回答 1

2

如果您需要支持 Windows XP,那么您只需要使用在 Windows XP 中定义的字段。问题不直接在于结构的大小,而在于cbSize. 如果它与 API 期望的值不匹配,则 API 调用将失败。因此,传递较大 Vista 版本结构的 cbSize 将导致 API 失败(即返回失败代码,它不会崩溃)。

如果您需要,您可以检测您正在运行的 Windows 版本并传入该版本的 Windows 期望的大小(您可以传入更大尺寸的结构,Windows 将忽略额外的字节)但您只需要如果您需要拥有cd填写 Vista+,请执行此操作。

请参阅此博客文章,了解为何cbSize拒绝发送较大的邮件的原因。

于 2013-07-27T21:02:23.933 回答