如何用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.Exception
和System.Security.Cryptography.StrongNameSignatureInformation
。
所有的话,我基本上有两个问题:
- 有没有办法编写
S_OK
而不是VSConstants.S_OK
? - 如何将方法的返回值与
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))
{
// ...
}