从c#.net代码返回S_OK或E_FAIL的值是多少?

时间:2008-12-12 14:12:08

标签: c# .net com return-value

我正在实现一个COM接口,该接口应返回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'语法覆盖)

唷!谁知道宣布一个标准的返回值是多么棘手....某个地方肯定有一个潜伏的类我应该像返回Win32ReturnCodes.E _失败一样; .. 。叹息

终极解决方案:

我现在通过从pinvoke.net获取(大量但非常有用)HRESULT枚举并将其添加到我的解决方案中来实现此目的。然后使用类似这样的东西:

return HRESULT.S_OK;

6 个答案:

答案 0 :(得分:8)

E_FAIL是WinError.h中的Hex 80004005

您可以看到完整的WinError.h file here。您不必仅仅为了查看值而安装C ++。

<强>更新

0x80004005的有符号和无符号版本只是同一位掩码的两种表示形式。如果您收到了投射错误,请使用负签名值。当铸造到联合国签署的长期,它将是“正确的”价值。用C#自己测试,它会工作 e.g。

此代码

    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

的值是安全的

答案 1 :(得分:7)

从WinError.h for Win32

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)

要查找此类答案,请使用visual studio的文件搜索来搜索visual studio安装目录的VC Include目录中的头文件。

C:\Program Files\Microsoft Visual Studio 9.0\VC\include

答案 2 :(得分:4)

使用“unchecked”关键字执行此操作。

e.g。

const int E_FAIL = unchecked((int)0x80004005);

答案 3 :(得分:3)

您可能希望

VSConstants

VSConstants.S_OK Field

成功的通用HRESULT。

命名空间:Microsoft.VisualStudio

程序集:Microsoft.VisualStudio.Shell.10.0(在Microsoft.VisualStudio.Shell.10.0.dll中)

答案 4 :(得分:1)

我用过这个:

const int EFail = int.MinValue + 0x00004005;

在可读性(如果你习惯于十六进制代码)和C#的限制之间进行折衷。

答案 5 :(得分:-1)

您应该下载平台SDK(link

我搜索了代码并在winerror.h中找到了以下内容。

typedef long HRESULT;

#ifdef RC_INVOKED
#define _HRESULT_TYPEDEF_(_sc) _sc
#else // RC_INVOKED
#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)
#endif // RC_INVOKED

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)
#define S_OK  ((HRESULT)0x00000000L)

您应该返回E_FAIL而不是值。只需包含winerror.h。