Есть ли способ очистить значение GetLastWin32Error? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть этот небольшой кусочек кода.

[DllImport("library.dll", EntryPoint = "SomeoneElsesReadFunction")]
[return: MarshalAs(UnmanagedType.U4)]
private static extern UInt32 SomeoneElsesReadFunction(
    Int16[] data,
    Int16[] dataOrig,
    [MarshalAs(UnmanagedType.U2)]
    Int16 buffsize,
    ref int smpNum,
);

затем ...

var returnCode = SomeoneElsesReadFunction(Buffer, OrigBuffer, Consts.BufferSize, ref _sampleNumber);

int errorCode;

if ((errorCode = Marshal.GetLastWin32Error()) != 0)
{
    throw new Exception(string.Format("Device read failed. Windows System Error Code: {0}", errorCode));
}

, который происходит в более широком цикле, выполняемом несколько раз в секунду.

Я продолжаю получать errorCode из 183 на каждой итерации цикла.Когда я проверяю в VS-отладчике, я вижу, что Последняя ошибка Win32 равна 183 до вызова SomeoneElsesReadFunction(), а затем - 183.

Но есть ли способ очистки / сброса этого значения перед вызовом метода,так что я могу быть уверен, что когда я проверю впоследствии, что ошибка определенно возникает в методе с каждым вызовом, а не просто осталась от предыдущего вызова?

Редактировать

Чтобы прояснить путаницу с returnCode, оригинальный метод по какой-то причине возвращает код = 0 даже в конкретном состоянии ошибки, которое мне нужно проверить.По этой причине мне нужно вызвать GetLastWin32Error(), даже если returnCode равен 0 (ОК).

1 Ответ

0 голосов
/ 28 сентября 2018

Я думаю, что вы путаете коды ошибок и возвращаемые значения.SetLastError следует вызывать только тогда, когда функция генерирует ошибку, она никогда не должна делать SetLastError(0).Ваша работа как разработчика состоит в том, чтобы проверить, произошел ли сбой вызова функции, а затем выяснить, почему произошел сбой.

Код ошибки - дополнительная информация о причине сбоя функции, но ваш код не 't проверка возвращаемого значения, чтобы увидеть, был ли сбой.

var returnCode = SomeoneElsesReadFunction(Buffer, OrigBuffer, Consts.BufferSize, ref _sampleNumber);

if(!returnCode) // Did it fail?
{
    int errorCode;

    if ((errorCode = Marshal.GetLastWin32Error()) != 0) // Why did it fail?
    {
        throw new Exception(string.Format("Device read failed. Windows System Error Code: {0}", errorCode));
    } 
}
...