Danke,
den Fall ohne Overlapped I/O gucke ich mir mal an.
Ich kapsel halt nur die Sachen weg oder bau mir Funktionen dafür, wenn ich WinAPI Sachen für umständlich halte.
Zum Beispiel
OVERLAPPED make_overlapped( HANDLE Event )
{
OVERLAPPED retVal = { 0 };
retVal.hEvent = Event;
return retVal;
}
void f1()
{
HANDLE Pipe = ::CreateNamedPipe( .... );
HANDLE Event = ::CreateEvent( nullptr, TRUE, FALSE, nullptr );
OVERLAPPED ovl;
::SecurezeroMemory( &ovl, sizeof( ovl ) );
ovl.hEvent = Event:
::ConnectNamedPipe( Pipe, &ovl );
::CloseHandle( Pipe );
::CloseHandle( Event );
}
void f2()
{
Win32Handle Pipe = ::CreateNamedPipe( ... );
Win32Handle Event = ::CreateEvent( nullptr, TRUE, FALSE, nullptr );
OVERLAPPED ovl = win32_make_overlapped( Event );
::ConnectNamedPipe( Pipe, &ovl );
}
Ich finde f2 übersichtlicher, da es auf die Funktion reduziert ist und keine "störenden" mehrzeiligen Initialisierungen mitbringt. Insbesondere ewige GetLastError() Fehlerüberprüfungskaskaden finde ich unübersichtlich.
Außerdem erlauben die Kapselungen RAII, was mit C nicht so geht. Alles in allem eine Frage des persönlichen Stils und Gewohnheit, würde ich sagen...