LINUX.ORG.RU

Microsoft выпустила официальную Rust библиотеку для Windows API

 , , , ,


1

4

Библиотека оформлена в виде Rust crate под MIT License, который можно использовать вот так:

[dependencies]
windows = "0.2.1"

[build-dependencies]
windows = "0.2.1"

После этого в скрипте сборки build.rs можно сгенерировать те модули, которые нужны для вашего приложения:

fn main() {
    windows::build!(
        windows::data::xml::dom::*
        windows::win32::system_services::{CreateEventW, SetEvent, WaitForSingleObject}
        windows::win32::windows_programming::CloseHandle
    );
}

Документация о доступных модулях опубликована на docs.rs.

Пример кода:

mod bindings {
    ::windows::include_bindings!();
}

use bindings::{
    windows::data::xml::dom::*,
    windows::win32::system_services::{CreateEventW, SetEvent, WaitForSingleObject},
    windows::win32::windows_programming::CloseHandle,
};

fn main() -> windows::Result<()> {
    let doc = XmlDocument::new()?;
    doc.load_xml("<html>hello world</html>")?;

    let root = doc.document_element()?;
    assert!(root.node_name()? == "html");
    assert!(root.inner_text()? == "hello world");

    unsafe {
        let event = CreateEventW(
            std::ptr::null_mut(),
            true.into(),
            false.into(),
            std::ptr::null(),
        );

        SetEvent(event).ok()?;
        WaitForSingleObject(event, 0);
        CloseHandle(event).ok()?;
    }

    Ok(())
}

Для некоторых вызовов функций используется unsafe, так как эти функции предоставляются как они есть, не адаптируя их к конвенциями Rust. По такому же принципу устроен crate libc, который служит базовым crate для доступа к libc и используется как основа для пострения библиотек с безопасным интерфейсом.

Проект создан в рамках Win32 Metadata Project, который призван облегчить создание API для разных языков программирования. Вторая библиотека, которая была создана на основе Metadata Project на первое фазе проекта - C#/Win32. Также Microsoft анонсировала начало работы над версией для С++, которая использует современный стиль языка.

>>> Github

★★★★★

Проверено: Shaman007 ()
Последнее исправление: atsym (всего исправлений: 11)
Ответ на: комментарий от WatchCat

Вроде бы ребята попробовали кроссплатформенность на кутях, потом плюнули и переписали на натив. Если ты про 2гис

pornandme
()
Ответ на: комментарий от invy

Чтобы написать эти библиотеки проще. Все равно все заканчивается этими API, но до этого момента их колоссальными усилиями умельцы поддерживали ручками, а теперь Microsoft

vertexua ★★★★★
() автор топика
Последнее исправление: vertexua (всего исправлений: 1)
Ответ на: Меня лично не волнуют... от Moisha_Liberman

А это уже не вопрос, а вброс.

Эта новость - сама по себе вброс и оффтопик.

Чтобы один язык заменил другой нужен хотя бы один из этих критериев.

Например питон заменил старенький перл, потому что был проще и легче. В чем явное превосходво раста над си, мне не понятно.

acroobat
()
Ответ на: комментарий от pihter

unsafe локализован в функциях где понятны гарантии относительно поведения. Без этого нельзя, потому что ОС unsafe. Но можно оборачивать в safe

vertexua ★★★★★
() автор топика
Ответ на: комментарий от pornandme

На фоне гиганских бинарников, что генерит раст

Стрипать надо strip --strip-unneeded
Бинарники худеют в разы. В дистрах обычно стрипнутые бинарники.

Hungarian-Deniska
()
Ответ на: комментарий от WatchCat

В таких случаях...

хоть у мня они и редкость, я делаю по-другому. Основной код (на С как правило, с минимумом извращений) лучше бы сразу создавать под Linux. А вот портирование это уже потом и более-менее с минимумом дополнений. Например, вместо cygwin под windows я возьму сразу MinGW. Если мне нужен графический интерфейс, то это GTK+ (под винды он ставится и может быть включён в поставку приложения сразу).

Т.е., всегда есть ответ на вопрос что первично, что вторично. И всегда есть понимание что «совместимость» POSIX это не просто звук. Стандарт как таковой и так является портируемым на уровне исходников. Чем больше отступлений от стандарта, тем больше проблем.

Moisha_Liberman ★★
()
Ответ на: комментарий от pornandme

Ничего страшного. Все работает. Я так думаю из-за того что Rust выкачивает свои библиотеки, с ними собирает, потом эти дебаги выкидывать надо. Но это мой дилетанский взгляд, я не прогер.

Hungarian-Deniska
()
Ответ на: комментарий от Hungarian-Deniska

В дистрах растовские бинарники тоже стрипнутые. Вот смотри https://archlinux.org/packages/extra/x86_64/rav1e/ (распаковать zstd -d *). Там хедер есть, pkgconfig, все как полагается.

Исходный бинарь там вообще жирный был, я собирал сам.

Hungarian-Deniska
()
Ответ на: комментарий от pornandme

Да незачто, Господи! =)

Не ожидал столь подробного ответа )

Всегда пожалуйста. По всей видимости, ЛОР для всех разный. Для кого-то (наверное) это место для «потешить своё ЧСВ». Для меня, к сожалению, редко из-за загрузки, это помочь по возможности своим коллегам. Если знаю ответ, то чего же не ответить, авось поможет.

На фоне гиганских бинарников, что генерит раст, наверное и glibc статически прилинкованный не заметен

Если честно, то я не отношусь ни к числу хулителей-гонителей Rust, ни к числу его апологетов. Я бы так сказал – вот как ни появляется новый язык (пусть и офигенный), но его всегда сравнивают с С и С++. Просто потому, что сколько бы языков не появлялось, лучше-то ни чего всё равно нет. =)))

Moisha_Liberman ★★
()
Ответ на: Да незачто, Господи! =) от Moisha_Liberman

Если знаю ответ, то чего же не ответить, авось поможет

Класс, 5+

Я бы так сказал – вот как ни появляется новый язык (пусть и офигенный), но его всегда сравнивают с С и С++

Справедливости ради, давно не было языков, сравнимых с плюсами (в основном из-за вездессущих сборщиков мусора и увлеченностью разрабов байткодом)

pornandme
()
Последнее исправление: pornandme (всего исправлений: 2)
Ответ на: комментарий от pornandme

Не совсем так.

Всмысле прям инсталлер есть?

Для разработчика. Вот техпроцесс – https://www.gtk.org/docs/installations/windows Там использован MSYS2, внутри которого используется pacman. В начале ставим Core, потом ставим ещё и Glade. Как – там написано. Без Glade будет сложно прямо сразу создавать интерфейс на С (или python, например). Хотя, интерфейс приложения можно определять прямо в коде, без XML UI, который создаётся Glade.

Для пользователя. Вы просто создаёте интерфейс, включаете библиотеки в своё приложение и просто ставите своё приложение как это положено в Windows. Тут нужен только core (своего рода runtime). Как это делать подробно расписано в подразделе документа по ссылке выше (см. Building and distributing your application).

Когда-то на сайте GTK был для all-in-one Windows bundle. Теперь его там нет и остаётся только указанный способ. Но там даже тему adwaita можно «натянуть».

Moisha_Liberman ★★
()
Ответ на: комментарий от acroobat

+1!

Ну чтож поделать-то… Это всё теперь новости, которые мы сами заслужили. =)

Moisha_Liberman ★★
()

Вендокапец пришел откуда не ждали. Всех причастных и непричастных поздравляю.

WitcherGeralt ★★
()
Ответ на: комментарий от pornandme

Стрипаться может всё, что...

ненужно в исполняемом коде. Например, в той же генточке при установке, если я не заказывал отладочных версий библиотек (софта) и не планирую, например, пользоваться valgrind для отладки, например, это где-то на сервере происходит, то пострипано будет вообще всё, что ненужно в данном конкретном случае.

Например, на моём ноуте вот как это выглядит:

emerge --info | grep LDFLAGS
LDFLAGS="-Wl,-z,now -Wl,-z,relro -Wl,--as-needed"

Система сама отстрипует ненужное при сборке мира. Указание –release это как правило указание компилятору (и не факт что линкеру) использовать флаги оптимизации на этапе компиляции (и не факт что на этапе линковки). Strip работает с уже слинкованным кодом.

Правда, здесь нужно учитывать то, что флаги компиляции/линковки могут быть разные и та же опция включения lto (link-time optimization) может как улучшить ситуацию, так и навредить. Ну, например, если у Вас на всю голову используются -fPIC/-fPIE, нужные для ASLR (Address Space Layout Randomization), тогда Ваш код скорее всего встанет рачкомссс, т.к. ASLR противоречит lto. Даже, если честно, то система скорее всего и не соберётся. Если по-хорошему. Хотя, исключения возможно и бывают, но я их не видел.

Moisha_Liberman ★★
()
Ответ на: комментарий от pornandme

Да как угодно. =)

По сути, тема в GTK+ это сравнительно небольшой css-файл. А так-то темы любые есть – https://www.gnome-look.org/browse/cat/ и для иконок и для окон и для… Короче, вон ссылка, там поройтесь. =)

P.S. Винде в смысле смены тем до GTK/Gnome ещё как до Пекина… Реально.

P.P.S. Если интересно, то вот тут ссылка есть Что думаете о gtkmm? (комментарий) на туториал как создавать элементы интерфейса GTK+ прямо в своём коде, без Glade. Т.е., в коде С, например или python. Хотя, тутораил про С.

Moisha_Liberman ★★
()
Последнее исправление: Moisha_Liberman (всего исправлений: 2)
Ответ на: комментарий от Harald

не всем нужны IDE чтобы поправить три строки в коде по ssh, но для разработки нужны

fixed

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от metaprog

Зачем тебе царь? Он все равно ничего умного не скажет.

liksys ★★★★
()
Ответ на: комментарий от vertexua

Для новых оберток и раста может и имеет смысл. Для плюсов - мне кажется никто переписывать не будет.

Недостаток этого: есть подозрение что вся эта надстройка над апи более связанная между собой и когда что-то портируешь под онтопик уже не отделаешься имплементацией десятка функций.

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)

Также Microsoft анонсировала начало работы над версией для С++, которая использует современный стиль языка.

Ну хоть одна полезная новость на лоре.

LamerOk ★★★★★
()

Вроде rust позиционируется как системный. Вирусы под windows уже начали на нем писать ?

mx__ ★★★★★
()
Ответ на: комментарий от hateyoufeel

На кой черт совать тип переменной в её имя, если компилятор и так может это подсказать? Это ж не пистон какой-то.

В каком-то пистоне есть typing

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

В каком-то пистоне есть typing

И что, им кто-то пользуется? И прямо в сторонних библиотеках во всех он есть? И прямо всё работает из коробки без боли и страданий?

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Внезапно им пользуются. Адский говнокод типа бото им конечно не выправить, но более адекватные проекты его юзают

upcFrost ★★★★★
()
Ответ на: комментарий от upcFrost

У меня был подобный опыт в Erlang, когда мы, конечно же, использовали dialyzer во все поля для проверки типов у нас, но на стыке со сторонними библиотеками возникали ад и холокост. Мне что-то кажется, в пистоне аналогично, учитывая что многие библиотеки пытаются поддерживать старые версии языка или просто забили.

Иными словами, прикручивать статические типы к изначально динамическому языку с 30-летней историей говнокодерства – это крайне неблагодарное занятие. Вон на TypeScript и вопли вокруг него можешь посмотреть ради примера.

hateyoufeel ★★★★★
()
Последнее исправление: hateyoufeel (всего исправлений: 2)
Ответ на: комментарий от hateyoufeel

Можешь мне поверить что корявые типы из левых либ это меньшая, даже можно сказать несуществующая, из проблем питона. Там есть куда хуже вещи где никакой тайпинг не спасёт. Тот же бото - эталон в этом плане, там рефлекшн прям с первых строк

upcFrost ★★★★★
()
Ответ на: комментарий от Harald

мда, на няшной сишечке оно всё как-то красивее привычнее выглядит

поправил

red75prim ★★★
()
Ответ на: комментарий от hateyoufeel

Ненавижу венгерскую нотацию, но в защиту: она начала шагать по планете во времена, когда ни редакторы, ни IDE не разбирали код, не строили кодовую модель, не давали автодополнения, были без подсветки синтаксиса. И да, тогда иметь ВСЮ информацию о переменной или прочем символе было здравой идеей, дабы не скролиться постоянно, читая код, что бы только вспомнить какой тип переменной. Это не про компилятор, это про чтение программистом в тех условиях. Сейчас это анахронизм.

hatred ★★★
()
Ответ на: комментарий от hummer

на компьютере с кнопкой Turbo и индикатором тактовой частоты.

У меня на таком уже был P100 и 16Mb RAM (чуть позже 24Mb), этого уже вполне хватало для BC++ 3.1 в котором уже была подсветка синтаксиса. Нормально работал и виндовый BC++ 4.0 и 5.0. Delphi 3.0 и C++ Builder 4.0 там тоже вполне себе работали, а там уже и автодополнение было. Продукты от MS как-то мимо прошли.

ЗЫ кнопку Turbo завёл в разрыв PC Speaker ;-)

hatred ★★★
()
Последнее исправление: hatred (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.