3

如何比较从方法返回的值与HRESULT?我试过这个,但它不工作:

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

DeleteMultiple()的类型定义是:

HRESULT IPropertyStorage.DeleteMultiple(Ulong, Propspec)

我已经写了VSConstants.S_OK。有没有办法S_OK直接写?我尝试这样做,但收到一个错误,表明S_OK当前上下文中不存在该错误。

我还检查HRESULTWindows 通用系统范围的代码。但我收到的价值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...
{
}
4

3 回答 3

6

如果将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");
}

Explanation: when PreserveSig is false you can omit the returned HRESULT value, but internally this value is actually checked, so if HRESULT is different from S_OK an exception is thrown.

于 2012-10-30T19:33:38.863 回答
4

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

enum HRESULT : long
{
S_FALSE = 0x0001,
S_OK = 0x0000,
E_INVALIDARG = 0x80070057,
E_OUTOFMEMORY = 0x8007000E
}
于 2012-10-30T18:50:20.387 回答
3

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))
{
    // ...
}
于 2012-10-30T18:50:05.780 回答