Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何封送WinApi函数的返回值?_C#_Winapi_Marshalling - Fatal编程技术网

C# 如何封送WinApi函数的返回值?

C# 如何封送WinApi函数的返回值?,c#,winapi,marshalling,C#,Winapi,Marshalling,简单:如何显式封送WinAPi函数的结果? 我知道如何在C#中封送WinApi函数的参数,但如何也封送返回值?还是我真的要把他们封走?我知道WinAPi只返回BOOL或所有类型的INT(句柄在非托管代码中也是INT) 由于FileAttributes是enum,每个值都可以很容易地转换为int,因此我确信使用这种表示法是安全的。但是我可以像处理参数一样在这个签名中封送结果吗?实际上我只知道封送类和封送属性。是的,你可以。您只需要使用[return:::属性语法,例如: [return: Mar

简单:如何显式封送WinAPi函数的结果?
我知道如何在C#中封送WinApi函数的参数,但如何也封送返回值?还是我真的要把他们封走?我知道WinAPi只返回
BOOL
或所有类型的
INT
(句柄在非托管代码中也是INT)


由于
FileAttributes
是enum,每个值都可以很容易地转换为
int
,因此我确信使用这种表示法是安全的。但是我可以像处理参数一样在这个签名中封送结果吗?实际上我只知道
封送
类和
封送
属性。

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

[return: MarshalAs(UnmanagedType.LPStruct)]
但在你的情况下,没有编组可以做。这样的整型转换不需要编组,所以只需在示例中使用第二种形式


如果确实需要,可以编写一个名为
GetFileAttributes()
的公共方法,该方法检查返回值的有效性。

它是否只适用于非托管类型?或者我也可以封送到托管类型吗?@mini me
marshallas
仅适用于具有值的类型。是的,这很明显。但我的意思是指挥另一个方向。似乎封送处理只在从托管到非托管的
之间起作用。@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)]