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)

Для вызовов функций используется unsafe.

Вроде не везде unsafe требуется, если они могут предоставить безопасный апи,(например для winrt или com) то unsafe не нужен, в твоем примере это видно по вызовам XmlDocument.

anonymous
()

Проект создан в рамках Win32 Metadata Project, который призван облегчить создание API для разных языков программирования.

Третий язык, после шарпа и раста для которого они начали делать апи это C++ https://github.com/microsoft/cppwin32 . Если для C++ будет также качественно сделано как в C++/WinRT, то будет очень неплохо.

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

О, спасибо, добавил

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

vertexua ★★★★★
() автор топика

Будет как с Microsoft Java?

anonymous
()

Хоспидя! Как же вендовый api ублюдочно выглядит. Хорошо они ещё свою любимую венгерскую нотацию в руст не потащили, а то был бы совсем ад.

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

Microsoft для радужных растоманов?

anonymous
()

Достойные новости для юниксового форума. Так победим!

LikeABoss
()
Ответ на: комментарий от hateyoufeel
s_ansLOR_RUAnswer = ЧтоТебеСобакаНеНравитсяВТакойНотацииДляФункцийИПеременных(a_hWindow, a_hAskPtr);
htClientNode = new THTTPSClassWithPonyAndMagic(s_addrLOR_RUAdress, i_addrLOR_RUPort);
...
htClientNode.Send(s_ansLOR_RUAnswer);

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

Непонятно, зачем они суффикс W притащили. Могли бы функции с суффиксом W затащить без него, а к старым версиям добавить суффикс A.

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

Хорошо они ещё свою любимую венгерскую нотацию в руст не потащили, а то был бы совсем ад.

Венгерская нотация использовалась ими во всякого рода MFC. В более новых фреймворках Microsoft давно от неё отказался и всячески призывает не использовать. Например в C#.

P.S. Тоже терпеть не могу венгерскую нотацию.

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

Непонятно, зачем они суффикс W притащили. Могли бы функции с суффиксом W затащить без него, а к старым версиям добавить суффикс A.

Без суффикса у них сишный макрос, который в зависимости от настроек сборки может разворачиваться в A или W версию, можно собирать обе, было актуально для Win95 и WinNT и с тех пор и тянется для совместимости.

anonymous
()

Буду первым ворчуном.

Причём здесь Linux?

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

А что рекомендуют вместо венгерской? АБВГДейку? Я вот «венгерский» код могу читать, все остальное - какой-то реверс инжиниринг смысла «что хотел сказать автор этого куска»

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

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

hateyoufeel ★★★★★
()

РРРЯЯЯЯЯЯ РУСТ НЕ НУЖЕН ТОЛЬКО СВЯТАЯ СИШКА ОЧЕРЕДНОЙ МОДНЫЙ ЯЗЫЧОК ДЛЯ СМУЗИХЛЁБОВ ЧЕРЕЗ ГОД ЗАГНЁТСЯ РРРРРЯЯЯЯЯ

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

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

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

А что рекомендуют вместо венгерской? АБВГДейку? Я вот «венгерский» код могу читать, все остальное - какой-то реверс инжиниринг смысла «что хотел сказать автор этого куска»

Вместо рекомендуют использовать нормальную IDE. Смысл венгерской нотации - упрощать жизнь тем, кто пишет код в текстовом редакторе на компьютере с кнопкой Turbo и индикатором тактовой частоты.

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

Между прочим с кросс-платформенной реализацией для Linux и macOS в виде winelib.

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

Смысл венгерской нотации - упрощать жизнь тем, кто пишет код в текстовом редакторе на компьютере с кнопкой Turbo и индикатором тактовой частоты.

На самом деле, нет. Я читал статью автора этой самой нотации. Он там писал, что изначально хотел, чтобы эти префиксы обозначали то, что хранится в переменной, а не её тип с точки зрения компиляторе. Т.е. означали семантику значения. Но в этоге вышло то что вышло. Почему он про typedef или обёртку-структуру не подумал, я не знаю. Возможно, в досовиндовых компиляторах с этим проблемы были.

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

Смысл венгерской нотации - упрощать жизнь тем, кто пишет код в текстовом редакторе на компьютере с кнопкой Turbo и индикатором тактовой частоты.

На самом деле, нет. Я читал статью автора этой самой нотации. Он там писал, что изначально хотел, чтобы эти префиксы обозначали то, что хранится в переменной, а не её тип с точки зрения компиляторе. Т.е. означали семантику значения. Но в этоге вышло то что вышло. Почему он про typedef или обёртку-структуру не подумал, я не знаю. Возможно, в досовиндовых компиляторах с этим проблемы были.

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

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

Да. Щас им объяснят что они все неправильно сделали, и... майкрософт забьет на rust и/или купит их с потрохами, чтоб делали правильно.

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

Для обозначения того, что находится в переменной существует просто имя переменной, без всех элих идиотских префиктов и суфиксов.

Я что, спорю что ли?

Всю остальную информацию о переменной должен предоставлять IDE.

Когда это изобреталось, IDE в современном понимании этого термина не было.

С другой стороны, а ответь мне вот на какой вопрос: если ты пишешь на C++/C#/Java, ты как-нибудь обозначаешь переменные-члены объекта или класса? Если да, то чем это по сути от венгерской нотации отличается?

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

Детям IDE тоже нужен. Что детям действительно не нужно, так это венгерская нотация.

hummer
()

Не нужно же! Да еще и лютый офтоп.

Какой смысл велосипедить что-то на нативном апи, когда есть куча cross platform библиотек и все адекватные люди пытаются спрятать и абстрагироваться от нативных апи.

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

Это было/есть/пока_есть в сишке, где нет неймспейсов и где тупо вместо них приписывают префикс к определениям: gtk_window_new (). Зачем оно нужно в современных языках, я диву дивлюсь.

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

есть куча cross platform библиотек

Электрон, например или Java.

Лучше бы под одну систему, но нормально сделали..

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

Если да, то чем это по сути от венгерской нотации отличается?

ЭТА ДРУГОЕ!!1

meliafaro ★★★★★
()

На winehq это как-то может повлиять?

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

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

Грубо говоря, идея была в том, чтобы программист не складывал, случайно, градусы Цельсия и Фаренгейта. Поэтому переменная, в которой градусы Цельсия, будет иметь префикс cd, а переменная, в которой градусы Фаренгейта, префикс fd. Если программист ошибётся и сложит одно с другим, то это будет проще заметить.

В нормальном языке вместо этого можно и нужно использовать систему типов, и писать что-то вроде

newtype Celsius = Celsius Int deriving (Eq, Ord, Num)
newtype Fahrenheit = Fahrenheit Int deriving (Eq, Ord, Num)

и компилятор сам проследит, чтобы Цельсия с Цельсием можно было складывать, Фаренгейта с Фаренгейтом — тоже, а вот одно с другим — нельзя. Но в то время хороших языков не было.

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

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

hummer
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.