Проверка возвращаемого значения из метода для 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
,
Все сказанное, у меня в основном два вопроса:
- Есть ли способ написать
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...
{
}
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))
{
// ...
}