当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《从c#.net代码返回S_OK或E_FAIL的值是多少?》经验,为你挑选了2个好方法。

我正在实现一个COM接口,它应该返回int值S_OKE_FAIL.我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 _FAIL; ...... 叹息

终极解决方案:

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

return HRESULT.S_OK;

Binary Worri.. 8

E_FAIL是WinError.h中的Hex 80004005

您可以在此处查看完整的WinError.h文件.您不必仅仅为了查看值而安装C++.

更新:

有符号和无符号版本的0x80004005只是同一位掩码的两种表示形式.如果您收到了投射错误,请使用负签名值.当铸造到联合国签署的长期,它将是"正确的"价值.在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的值是安全的



1> Binary Worri..:

E_FAIL是WinError.h中的Hex 80004005

您可以在此处查看完整的WinError.h文件.您不必仅仅为了查看值而安装C++.

更新:

有符号和无符号版本的0x80004005只是同一位掩码的两种表示形式.如果您收到了投射错误,请使用负签名值.当铸造到联合国签署的长期,它将是"正确的"价值.在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的值是安全的



2> Rob Prouse..:

从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

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有