Проверка возвращаемого значения из метода для HRESULT S_OK

Как я могу сравнить значение, возвращаемое из метода с 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,

Все сказанное, у меня в основном два вопроса:

  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...
{
}

3 ответа

Решение

Что если вы установите 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, но внутренне это значение фактически проверяется, поэтому, если 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))
{
    // ...
}
Другие вопросы по тегам