Ошибка PeekNamedPipe, но GetLastError возвращает 0

Меня смущает Windows API. Я пытаюсь посмотреть, остались ли байты в анонимном канале, используя PeekNamedPipe. Эта функция не работает, но GetLastError() не возвращает ошибку.

Соответствующая часть моего кода

if( !PeekNamedPipe( handle, NULL, 0, NULL, &numBytesAvailable, NULL ) )
  throw PeekNamedPipeException( "GetLastError() returned " + std::to_string( GetLastError() ) );

Это выдает ошибку, генерируя следующее сообщение:

terminate called after throwing an instance of 'PeekNamedPipeException'
  what():  GetLastError() returned 0

Но если PeekNamedPipe терпит неудачу, GetLastError не должна возвращать 0 (== ERROR_SUCCESS), верно?

Спасибо за помощь!


person Sh4pe    schedule 17.10.2013    source источник


Ответы (1)


Вероятно, это связано с тем, что между PeekNamedPipe и вашим вызовом GetLastError вызывается больше системных функций (за кулисами).

Сохраните значение из GetLastError во временной переменной и используйте ее при построении строки.

person Some programmer dude    schedule 17.10.2013
comment
+1 В данном конкретном случае единственное, что может быть причиной этого, - это что-то, вызванное временной конструкцией std::string из буквальной преамбулы сообщения об исключении. GetLastError() будет срабатывать до фактического ctor и, очевидно, срабатывает до вызова to_string или фактического броска, так что это исключает почти все остальное, что я вижу, кроме этой конструкции временной строки. - person WhozCraig; 17.10.2013