← All posts tagged winapi

lovesan

Написал тут недавно — библиотека-звонилка для винды. Обертка над RAS API, пока что может просто поднимать соединение по имени, закрывать, и сообщать о том, существует ли оно уже. Для VPN, диалапа, и пр.

Может кому надо:
github.com

lovesan

Рационализация моей работы с COM. Необходимая, наверное, вещь, раз тут один долбоеб уже заикнулся об этом.

Да, может OLE и протухло. Может, на чистом COM/OLE уже никто не пишет.
Но, чуваки, без интерфейса к COM на винде делать вообще нехуй. Совершенно.
Десктопные приложения, игрушки, или даже сервисы, без COM/OLE на винде не написать.

Любой язык, платформа или рантайм, который не принимает в расчет COM, у которого нет качественного интерфейса к этому — на винде нежизнеспособен и является как максимум академической игрушкой, а обычно же — студенческой поделкой.

lovesan

Все-таки, DWM очень интересно устроен.
Очень интересно позволяет себя абьюзить:

img218.imageshack.us
синее там это окно.

Код:
pastebin.com

Обращаю внимание — Aero выключен. И мы там вообще не используем никакие виндовые средства для регуляции прозрачности.
Просто рисуем в HWND через Direct3D:

device->OMSetRenderTargets(1, &backBufferRTV, NULL);

FLOAT clearColor[4] = { 0.0f, 0.2f, 1.0f, 0.4f };
device->ClearRenderTargetView(backBufferRTV, clearColor);

swapChain->Present(0, 0);

Окно там обычное:
WS_POPUP // просто окошко, "без всего"
WS_EX_COMPOSITED // указание оконному менеджеру на то, что контролы в окне рисуются "bottom-to-top"(т.н. "алгоритмом художника"), по очереди

Тем не менее, у нас там не плотный синий квадрат, а вот такая прозрачная фиговина. Получается, мы рисуем прямо в текстуру, которую DWM использует для отображения окна.

А разгадка одна:

MARGINS m = {-1};
DwmExtendFrameIntoClientArea(hwnd, &m);

lovesan

Полтора месяца я ебался с кривым Clozure CL, который поддерживает метаобъектный протокол CLOS через задницу, и то кое-как.

Но, я таки его одолел, и по этому случаю закоммитил в Doors: github.com
Теперь на CCL тоже можно писать COM-компоненты, и дергать COM-интерфейсы и даже целые COM-классы.
Еще я тестировал на clisp и SBCL, там тоже все хорошо работает.

Пример тут, например: github.com
Ясно видна сила MOP — класс hello-world-object является инстансом класса factory-class, а последний является инстансом и одновременно наследником com-class. А все три метаобъекта классов, и все их экземпляры, являются инстансами com-object.
com-обжекты можно дичайше круто передавать в чужой код, и чужой код, на каком-нибудь C++ или C#, будет дергать через виртуальные функции интерфейсов родные лисповые обобщенные фунцкции, которые мы писали на лиспе.

Метаклассы это вообще круто, они дичайше абстрагируют и очень сильно помогают писать меньше кода.

lovesan

Все-таки, только пописав немного на плюсах начинаешь понимать, как охуительно прекрасна объектная система Common Lisp.

Накатал тут, для своих экспериментов с Direct3D и Direct2D, небольшую библиотеку-надстройку над winapi на плюсцах, которая абстрагирует Топлевел-окошко в event-driven стиле.

Планирую ее потом переписать на коммонлиспе, сделать евенты полноценными, и вообще, расширить и улучшить всячески, разными контролами и так далее, до подобия WPF.

Но не суть. Суть в том, что я в полной мере почувствовал уебищность, кривоту и неюзабельность плюсов.
Плюсы это невыразимый, блевотный пиздец.

Например, кто догадается — зачем там в классе Window метод Init()?
Второй вопрос — какие последствия это влечет в контексте удобства пользования классом?

SimpleWindows.hpp
pastebin.com

SimpleWindows.cpp
pastebin.com