Почему [out] параметры передаются только в Finish_ вызовах?
Допустим, у меня имеется вызов Read(ULONG count, [out, size_is (count)] ULONG* buffer)
В асинхронном интерфейсе он выглядит так:
Begin_Read(ULONG count);
Finish_Read(ULONG* buffer);
Предположим, я пишу асинхронный сервер. По вызову Begin_Read, я, вроде бы, должен начать асинхронную операцию чтения данных в буфер пользователя. Но, блин, я еще не знаю адрес этого буфера! Так что, придется выделять временный буфер, читать туда, а по Finish_Read копировать его в буфер пользователя. Офигенно эффективно кто-то придумал!
С [in, out] параметрами еще хуже. Они передаются два раза, один раз в Begin_, а второй раз — в Finish_ методе. И, естественно, никто не гарантирует, что будут переданы одинаковые значения. Это тоже "толково" кто-то придумал, спасибо ему, мать-перемать.
Неужели не дотумкали до простой вещи: ВСЕ параметры, как входные, так и выходные, надо передавать в Begin_ методе, а Finish_ метод должен только возвращать код завершения? Не было бы проблем ни с [out], ни с [in. out], и вообще, Finish можно было оставить один на все методы интерфейса.
Ведь так сделано умными людьми во многих других системах. ASPI, например, и других, где используются асинхронные операции.
Ну почему этим уродам надо все делать обязательно в извращенной форме?