gpt4 book ai didi

c# - 从 c# .net 代码返回 S_OK 或 E_FAIL 的值是什么?

转载 作者:可可西里 更新时间:2023-11-01 08:37:31 28 4
gpt4 key购买 nike

我正在实现一个 COM 接口(interface),它应该返回 S_OKE_FAIL 的 int 值。我可以返回 S_OK,因为我从另一个调用 (Marshal.QueryInterface) 得到它,但是如果我想返回一个失败值,我为 E_FAIL 使用什么实际值>?

(这是一个很难找到答案的基本问题)

假设它是 Win32 API 中定义的特定数字,有没有办法在 .net 代码中使用它而不声明我自己的常量?

谢谢!

更新(在下面回答):

也许我是个彻头彻尾的笨蛋,但我对此有疑问。根据我的 Platform SDK,HRESULT 是一个 LONG,它是一个 32 位有符号整数,对吗?所以可能的值 –2,147,483,648 到 2,147,483,647。但是 0x80004005 = 2,147,500,037 即 > 2,147,483,647。什么给!?

这意味着当我尝试将其放入我的代码中时:

const int E_FAIL = 0x80004005;

我收到编译器错误无法将类型“uint”隐式转换为“int”

更新 2:

我要这样声明:

const int E_FAIL = -2147467259;

因为如果我尝试做这样的事情:

const UInt32 E_FAIL = 0x80004005;
return (Int32)E_FAIL;

我收到编译器错误无法将常量值“2147500037”转换为“int”(使用“unchecked”语法覆盖)

呸!谁知道声明一个标准的返回值会有多棘手....一定有一个类潜伏在我应该使用的地方,比如 return Win32ReturnCodes.E_FAIL; ... 叹息

最终解决方案:

我现在通过从 pinvoke.net 获取(大量但非常有用的)HRESULT 枚举来做到这一点并将其添加到我的解决方案中。然后像这样使用它:

return HRESULT.S_OK;

最佳答案

E_FAIL 在 WinError.h 中是 Hex 80004005

您可以看到完整的 Common HRESULT Values .您不必为了查看值而安装 C++。

更新:

0x80004005 的有符号和无符号版本只是同一位掩码的两种表示形式。如果您遇到转换错误,请使用负符号值。当转换为 UN signed long 时,它将是“正确的”值。在 C# 中自己测试,它会工作例如

这段代码

    static void Main(string[] args)
{
UInt32 us = 0x80004005;
Int32 s = (Int32)us;

Console.WriteLine("Unsigned {0}", us);
Console.WriteLine("Signed {0}", s);
Console.WriteLine("Signed as unsigned {0}", (UInt32)s);

Console.ReadKey();
}

将产生这个输出

  • 未签名 2147500037
  • 签名-2147467259
  • 已签名为未签名 2147500037

所以使用-2147467259作为E_FAIL的值是安全的

关于c# - 从 c# .net 代码返回 S_OK 或 E_FAIL 的值是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/362861/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com