从S_OK的hresult方法中检查返回值



如何用HRESULT比较从方法返回的值?我尝试过,但它不起作用:

FPropStg.DeleteMultiple(1, psProp) == VSConstants.S_OK

deletemultiple()的类型定义为:

HRESULT IPropertyStorage.DeleteMultiple(Ulong, Propspec)

我已经写了VSConstants.S_OK。有什么方法可以直接写S_OK?我尝试这样做,但出现了一个错误,表明S_OK在当前上下文中不存在。

我还针对Windows Common Winder Wide代码检查了HRESULT。但是我对HRESULT收到的价值不在该列表中。请注意,我包括命名空间System.ExceptionSystem.Security.Cryptography.StrongNameSignatureInformation

所有的话,我基本上有两个问题:

  1. 有没有办法编写S_OK而不是VSConstants.S_OK
  2. 如何将方法的返回值与S_OK进行比较?
HRESULT hr = FPropStg.DeleteMultiple(1, psProp);
if (hr == S_OK) // S_OK does not exist in the current context...
{
}

如果将 preservesig 设置为 false 怎么办?这样的东西:

您声明了与此相似的功能(我做到了,我不知道确切的签名...但是您愿意)

[DllImport("ole32.dll", EntryPoint = "DeleteMultiple", ExactSpelling = true, PreserveSig = false)]
public static extern void DeleteMultiple(ulong cpspec, PropSpec[] rgpspec);

并以这种方式称呼

try
{
    FPropStg.DeleteMultiple(1, psProp);
}
catch (Exception exp)
{
    MessageBox.Show(exp.Message, "Error on DeleteMutiple");
}

说明: preservesig false 您可以省略返回的 hresult value,但在内部,此值是实际检查了,因此,如果 hresult s_ok 不同。

您可以使用此枚举来定义确定,它来自pinvoke:

enum HRESULT : long
{
S_FALSE = 0x0001,
S_OK = 0x0000,
E_INVALIDARG = 0x80070057,
E_OUTOFMEMORY = 0x8007000E
}

HRESULT只是一个无符号的32位整数值。您可以构建自己的常数类,以帮助您进行这些比较:

public static class HResults
{
    public static readonly int S_OK = 0;
    public static readonly int STG_E_ACCESSDENIED =  unchecked((int)0x80030005);
}

使用:

if (HResults.S_OK == FPropStg.DeleteMultiple(1, psProp))
{
    // ...
}

相关内容

  • 没有找到相关文章

最新更新