2012-10-30 57 views
2

如何將方法返回的值與HRESULT進行比較?我試過,但它不工作:檢查S_OK的HRESULT方法的返回值

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

類型確定指標爲DeleteMultiple()是:

HRESULT IPropertyStorage.DeleteMultiple(Ulong, Propspec) 

我已經寫VSConstants.S_OK。有沒有辦法直接寫S_OK?我試圖這樣做,但得到一個錯誤,表明S_OK在當前上下文中不存在。

我還檢查了HRESULTWindows common system-wide codes。但是我收到的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

如果你設置PreserveSigfalse?事情是這樣的:

你聲明與此類似的功能(我做了起來,我不知道確切的簽名......但你這樣做)

[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可以省略返回HRESULT值,但內部實際上檢查此值,所以如果HRESULT不同於S_OK將引發異常。

3

HRESULT is simply an unsigned 32bit integer value。你可以建立自己的常量類來幫助你做這些比較:

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)) 
{ 
    // ... 
} 
+0

非常感謝。但它給了我一個錯誤。它說:「如果語句在左側有整數,右側無效」。我遇到了同樣的情況。 :/你的答案與我之前嘗試的類似,如果(FPropStg.DeleteMultiple(1,psProp)== VSConstants.S_OK)。我得到了相同的錯誤,無效和整數無法比較。 –

+0

我有兩個問題通過你的答案解決了第一個和第三個問題。謝謝。第二個問題的任何想法?即無效和整數問題? –

3

您可以使用此枚舉來定義好了,它是從pinvoke

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