Anton Kovalenko (
akovalenko) wrote2005-08-20 11:54 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Зачем они издеваются, нехорошие люди?
В последнее время как-то чаще приходится иметь дело с winapi, и чем больше приходится, тем любезнее мне становятся всякие линуксы. Там, конечно, тоже многое бывает, но не до такой степени.
Вот, к примеру, моя давняя любовь, GetModuleFileName:
If the length of the path exceeds the size specified by the nSize parameter, the function succeeds and the string is truncated to nSize characters and null terminated.
Я очень надеюсь, что горделивые интонации в последней фразе — плод моего воображения. Потому что пусть бы она при недостаточном буфере succeeded, но он был бы не null terminated; или пусть он был бы null terminated, но тогда она бы failed — а так не очень понятно, какой телепатией я узнаю, хватило буфера или нет. Да, я знаю и традиционный способ борьбы (выделить MAX_PATH и не париться), и нетрадиционный (записать не нуль в последний байт буфера и потом проверить), и вообще (на всякий случай) я тут просто брюзжу, а не консультаций прошу.
Ещё замечательно, разумеется, что создать анонимный pipe для overlapped I/O невозможно. MSDN рассказывает, что анонимные пайпы на самом деле реализованы через автоматически-именованные (мне всегда было интересно, как это может быть правдой для Win9x, где серверная сторона named pipes не поддерживается, а анонимные pipes как-то работают). Ну вот и забыли в этой обёртке предусмотреть способ включить overlapped I/O. И на пустом месте приходится городить две threads да пачку event'ов - threads, конечно, дешёвые и легковесные, это мы наслышаны, просто писать больше кода (а потом читать) — это неприятно.
Есть, конечно, вещи, которые упираются в "культурные различия" и сами по себе, может, и неплохи, хоть мне и дико: все эти пляски с консольной и GUI подсистемами (надеюсь, это будут давить: в WinXP появилась давно чаемая мною AttachConsole, с которой эта разница начинает становиться делом чистой традиции); то, что у низкоуровневой по моим понятиям CreateProcess есть флаги, которые управляют появлением курсора с песочными часами перед запуском программы; то, что при разлогинивании пользователя ни в чём не виноватым процессам-сервисам посылается сигнал, который вообще-то придуман для Ctrl+C и Ctrl+Break; то, что GUI-процесс обязательно должен создать окно (хоть скрытое), чтобы стать foreground'ным, и сделать GetMessage, чтобы убрать песочные часы: это приходится делать и в простых запускалках-wrapper'ах, в которых только и есть что GetModuleFileName да CreateProcess (а откуда возьмётся message? а мы его сами себе PostMessage()! а PeekMessage() вместо Get не подходит? нет, не подходит).
Ну, и традиционное: то, что select() делается только на сокеты, а MsgWaitForMultipleObjects, наоборот, просто ждать сокет без мороки с сообщениями и event'ами — не может. То, что SafeDllSearchMode (который с самого начала надо было сделать умолчанием) появился только в WinXP. То, что... а, ну ладно, хватит. А то ещё вспомню обо всяких более высокоуровневых вещах, нежели winapi — и до утра...