3

メソッドから返された値をと比較するにはどうすればよいHRESULTですか?私はこれを試しましたが、機能していません:

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

DeleteMultiple()のタイプ定義は次のとおりです。

HRESULT IPropertyStorage.DeleteMultiple(Ulong, Propspec)

私は書いVSConstants.S_OKた。S_OK直接書く方法はありますか?S_OKそうしようとしましたが、現在のコンテキストに存在しないことを示すエラーが発生しました。

HRESULTまた、Windowsの一般的なシステム全体のコードと照合しました。しかし、私が受け取っている価値HRESULTはそのリストにありません。名前空間System.Exceptionとを含めたことに注意してくださいSystem.Security.Cryptography.StrongNameSignatureInformation

とはいえ、基本的に2つの質問があります。

  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

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

説明: PreserveSigfalseの場合、返されたHRESULT値を省略できますが、内部でこの値が実際にチェックされるため、HRESULTがS_OKと異なる場合は例外がスローされます。

于 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 に答える