从c# .net代码中为S_OK或E_FAIL返回什么值?

htzpubme  于 2022-11-19  发布在  .NET
关注(0)|答案(6)|浏览(195)

我正在实现一个COM接口,它应该返回int值S_OKE_FAIL。我可以返回S_OK,因为我从另一个调用(Marshal.QueryInterface)中得到了它,但是如果我想返回一个失败值,我应该为E_FAIL使用什么实际值呢?
(It是一个很难找到答案的基本问题)
假设它是在Win32 API中定义的特定数字,有没有办法在.net代码中使用它而不声明自己的常量?
谢谢!

更新(回答如下):

也许我是一个十足的笨蛋,但我在这方面遇到了问题。根据我的Platform SDK,HRESULTLONG,它是一个32位有符号整数,对吗?所以可能的值是-2,147,483,648到2,147,483,647。但0x 80004005 = 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;
f4t66c6m

f4t66c6m1#

在WinError. h中,E_FAIL为十六进制80004005
您可以看到完整的Common HRESULT Values。您不必为了查看值而安装C++。

更新日期:

0x 80004005的有符号和无符号版本只是同一位掩码的两种表示。如果您遇到转换错误,请使用负符号值。当转换为UN有符号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的值是安全的

ar7v8xwq

ar7v8xwq2#

来自Win32的WinError.h

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)

若要寻找类似的答案,请使用Visual Studio的档案搜寻功能,在Visual Studio安装目录的VC Include目录中搜寻头文件。

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

aamkag613#

请使用“unchecked”关键字来执行此操作。
例如:

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

6yt4nkrj4#

VSConstants可能你想要你想要:
VS常量.S_OK字段
泛型HRESULT表示成功。
命名空间:Microsoft.VisualStudio
程序集:Microsoft.Visual Studio开发工具包 shell 程序.10.0(位于Microsoft.Visual Studio开发工具包 shell 程序.10.0.dll中)

l7mqbcuq

l7mqbcuq5#

我用过这个:

const int EFail = int.MinValue + 0x00004005;

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

eeq64g8w

eeq64g8w6#

您应该下载平台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即可。

相关问题