Почему Microsoft должно умереть

Михаил Елфимов on Ноя 29th 2006

Ещё немного о Microsoft.
Возьмем, к примеру, реализацию интерфейса IEnumString (нужен для работы IAutoComplete по своему списку строк). В нем всего 4 метода - Next, Skip, Reset и Clone. Хуйня. Делов-то. На их реализацию у меня ушло часа три.
Всё шло хорошо, пока я не начал тестировать Next. Этот метод просто отдаёт запрошенное количество строк из внутреннего массива. Просто отдаёт. Блядь! Пиздец! Суки! Твари! Просто отдаёт! Давайте посмотрим подробнее.
Сигнатура метода такая:

virtual /* [local] */ HRESULT STDMETHODCALLTYPE Next(
   /* [in] */ ULONG celt,
   /* [length_is][size_is][out] */ LPOLESTR *rgelt,
   /* [out] */ ULONG *pceltFetched) = 0;

Ни в одном месте в документации не сказано а) кто должен выделять массив указателей rgelt б) кто выделяет память под отдаваемые строки в) кто удаляет память после вызова г) каким именно образом должна выделяться и освобождаться память.
Путем длительных экспериментов и чтения google.groups (гугл хороший!) было выяснено, что строки на самом деле не LPOLESTR (длина строки хранится в первом слове) а LPWSTR (заканчиваются нулевым символом). Удаляются они, сцуко, через CoTaskMemFree, судя по стектрейсу после того как всё падает нахуй. Значит, выделяются они через родственную функцию CoTaskMemAlloc. В MSDN про эти функции ничего не написано, они есть только в заголовках. Блядские пидарасы из мелкософта!
Кроме того, у них опечатка в MSDN в описании IAutoComplete2::SetOptions - опция ACF_UPDOWNKEYDROPSLIST (написано) вместо ACO_UPDOWNKEYDROPSLIST (на самом деле).

Filed in - | No responses yet

0 нравится не нравится

Trackback URI | Comments RSS

Leave a Reply