C# 如何封送WinApi函数的返回值?
简单:如何显式封送WinAPi函数的结果?C# 如何封送WinApi函数的返回值?,c#,winapi,marshalling,C#,Winapi,Marshalling,简单:如何显式封送WinAPi函数的结果? 我知道如何在C#中封送WinApi函数的参数,但如何也封送返回值?还是我真的要把他们封走?我知道WinAPi只返回BOOL或所有类型的INT(句柄在非托管代码中也是INT) 由于FileAttributes是enum,每个值都可以很容易地转换为int,因此我确信使用这种表示法是安全的。但是我可以像处理参数一样在这个签名中封送结果吗?实际上我只知道封送类和封送属性。是的,你可以。您只需要使用[return:::属性语法,例如: [return: Mar
我知道如何在C#中封送WinApi函数的参数,但如何也封送返回值?还是我真的要把他们封走?我知道WinAPi只返回
BOOL
或所有类型的INT
(句柄在非托管代码中也是INT)
由于
FileAttributes
是enum,每个值都可以很容易地转换为int
,因此我确信使用这种表示法是安全的。但是我可以像处理参数一样在这个签名中封送结果吗?实际上我只知道封送
类和封送
属性。是的,你可以。您只需要使用[return:::
属性语法,例如:
[return: MarshalAs(UnmanagedType.LPStruct)]
但在你的情况下,没有编组可以做。这样的整型转换不需要编组,所以只需在示例中使用第二种形式
如果确实需要,可以编写一个名为
GetFileAttributes()
的公共方法,该方法检查返回值的有效性。它是否只适用于非托管类型?或者我也可以封送到托管类型吗?@mini memarshallas
仅适用于具有值的类型。是的,这很明显。但我的意思是指挥另一个方向。似乎封送处理只在从托管到非托管的之间起作用。@mini它在两个方向上都起作用。返回值来自非托管代码到托管代码。同样的,你也可以使用out
参数,以及像StringBuilder
这样的特殊参数。你到底为什么要显式调用函数的ANSI版本?1998年,他们想要回他们的代码。@CodyGray,因为谷歌和互联网上的其他地方都有这个函数的Ansi版本。我已经制定了所有3个版本,但这只是一个例子。我并不真的相信这一点,但即使这是真的,也不能说明它是正确的。至少,您需要CharSet.Auto
,但除此之外,没有理由不使用CharSet.Unicode
,除非您的目标是.NET 2.0和Windows 98。这不属于这里,但我使用了Ansi
,直到今天,我终于发现了如何使Auto
工作。因为它没有。pinvoke没有向我提供足够的信息。现在,我已经为我的所有WinApi文件函数实现了所有3个签名,以便我可以在它们之间切换。如果你说Unicode是一条出路。我会记住这一点,下次再考虑。好吗?您也必须使用适当的字符串类型,否则它将无法工作。对于Unicode,这将是UnmanagedType.LPWStr
,对于Auto,这将是UnmanagedType.LPTStr
。或者更好的是,完全省略marshallas
属性,只使用默认编组。CLR知道它对字符串类型做什么。
[return: MarshalAs(UnmanagedType.LPStruct)]