2008-12-12 57 views
11

我正在实现一个COM接口,该接口应返回int值S_OKE_FAIL。我确定返回S_OK,因为我从另一个调用(Marshal.QueryInterface)返回,但如果我想返回一个失败值,那么我应该使用什么实际值作为E_FAIL从c#.net代码返回S_OK或E_FAIL的值是什么?

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

假设它是Win32 API中定义的特定号码,有没有办法.NET代码中使用它没有说出我自己的常数?

谢谢!

更新(下面回答):

也许我是一个完整的plonker,但我有这个问题。根据我的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”到“廉政”。

更新2:

我要声明它是这样的:

const int E_FAIL = -2147467259; 

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

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

我得到一个编译器错误常量值'2147500037'无法转换为'int'(使用'unchecked'语法覆盖)

唷!谁知道如何申报一个标准的返回值是多么棘手......在某个地方必须有一个潜伏的类,我应该使用像return Win32ReturnCodes.E _ FAIL; ... 叹息

终极解决方案:

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

return HRESULT.S_OK; 

回答

8

E_FAIL是十六进制80004005 WinError.h中

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

UPDATE:

的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

所以,它的安全使用 - 21474 67259为E_FAIL

+0

感谢所有帮助! – Rory 2008-12-12 15:25:37

+1

链接已死,请参阅[常见HRESULT值](http://msdn.microsoft.com/en-us/library/windows/desktop/aa378137(v = vs.85).aspx) – bland 2013-09-05 20:05:19

7

值从WinError.h中为Win32

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L) 

要找到这样的答案,使用Visual Studio的文件搜索来搜索在VC头文件包括您的Visual Studio安装目录的目录。

C:\Program Files\Microsoft Visual Studio 9.0\VC\include 
-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。

1

我用这个:

const int EFail = int.MinValue + 0x00004005; 

可读性之间的妥协(如果你使用的十六进制代码)和C#的限制。

4

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

例如

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

VSConstants可能你想你想:

VSConstants.S_OK场

成功的通用HRESULT。

命名空间:Microsoft.VisualStudio

大会:Microsoft.VisualStudio.Shell.10.0(在Microsoft.VisualStudio.Shell.10.0.dll)