如何制作WinApi函数的返回值?

时间:2013-07-26 10:33:09

标签: c# winapi marshalling

简单:我如何明确封送 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);

由于FileAttributes是枚举,并且每个值都可以很容易地转换为int我确信这个符号是安全的。但是我可以像参与参数一样编组这个签名中的结果吗?我实际上只知道Marshal类和MarshalAs属性。

1 个答案:

答案 0 :(得分:5)

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

[return: MarshalAs(UnmanagedType.LPStruct)]

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

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