如何将方法返回的值与HRESULT进行比较?我试过了,但没有用:
FPropStg.DeleteMultiple(1, psProp) == VSConstants.S_OKDeleteMultiple()的类型定义是:
HRESULT IPropertyStorage.DeleteMultiple(Ulong, Propspec)我写了VSConstants.S_OK。有什么方法可以直接写S_OK吗?我尝试这样做,但得到了一个错误,表明S_OK在当前上下文中不存在。
我还检查了HRESULT和Windows通用系统代码。但是,我所收到的HRESULT值不在该列表中。请注意,我已经包含了名称空间System.Exception和System.Security.Cryptography.StrongNameSignatureInformation。
总之,我基本上有两个问题:
S_OK而不是VSConstants.S_OK?S_OKHRESULT hr = FPropStg.DeleteMultiple(1, psProp);
if (hr == S_OK) // S_OK does not exist in the current context...
{
}发布于 2012-10-30 19:33:38
如果您将PreserveSig设置为false会怎样?就像这样:
您声明了类似于此的函数(我创建了它,我不知道确切的signature...but )
[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值,但是在内部实际检查该值,因此如果HRESULT与S_OK不同,则抛出异常。
发布于 2012-10-30 18:50:20
您可以使用这个枚举来定义OK,它来自[医] pinvoke
enum HRESULT : long
{
S_FALSE = 0x0001,
S_OK = 0x0000,
E_INVALIDARG = 0x80070057,
E_OUTOFMEMORY = 0x8007000E
}发布于 2012-10-30 18:50:05
是一个没有符号的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))
{
// ...
}https://stackoverflow.com/questions/13145585
复制相似问题