4

简单:如何显式编组WinAPi 函数的结果?


我知道如何在 C# 中编组 WinApi 函数的参数,但我怎样才能编组返回值?还是我实际上必须编组它们?我了解 WinAPi 仅返回BOOL或所有类型的INT(句柄在非托管代码中也是 int )。

// common signature
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern int GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename);

// my prefered signature because easy to handle the result
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
static extern FileAttributes GetFileAttributes([MarshalAs(UnmanagedType.LPStr)] string filename);

因为FileAttributesis enum 并且每个值都可以很容易地转换为int我确信我对这个表示法是安全的。但是我可以像处理参数一样在这个签名中编组结果吗?我实际上只知道Marshal类和MarshalAs属​​性。

4

1 回答 1

5

是的你可以。您只需要使用[return:]属性语法,例如:

[return: MarshalAs(UnmanagedType.LPStruct)]

但在你的情况下,没有编组要做。不需要编组来转换这样的整数类型,因此只需在示例中使用第二种形式。

如果你真的想要,你可以编写一个公共方法来调用GetFileAttributes()它检查返回值的有效性。

于 2013-07-26T10:39:49.183 回答