Имеет ли смысл изучать низкоуровневое программирование WinAPI?[закрыто]

StackOverflow https://stackoverflow.com/questions/5507

  •  08-06-2019
  •  | 
  •  

Вопрос

Имеет ли смысл, имея все возможности управления C#, вернуться к Windows программирования Петцольда и попытаться создать код с чистым WinAPI?

Чему можно научиться из этого?Не слишком ли оно устарело, чтобы быть полезным?

Это было полезно?

Решение

Этот вопрос граничит с религиозным :) Но все же выскажу свои мысли.

Я вижу ценность в изучении Win32 API.Большинство, если не все, библиотеки графического интерфейса (управляемые или неуправляемые) приводят к вызовам API Win32.Даже самые полные библиотеки не покрывают 100% API, и, следовательно, всегда есть пробелы, которые необходимо закрывать прямыми вызовами API или P/вызовом.Некоторые имена оболочек вокруг вызовов API аналогичны именам базовых вызовов API, но эти имена не совсем самодокументируются.Таким образом, понимание базового API и используемой в нем терминологии поможет понять API-оболочки и то, что они на самом деле делают.

Кроме того, если вы понимаете природу базовых API-интерфейсов, используемых платформами, вы сможете лучше выбирать, какую функциональность библиотеки следует использовать в конкретном сценарии.

Ваше здоровье!

Другие советы

Я придерживался стандарта C/C++ в течение многих лет, прежде чем изучить Win32 API, и, если говорить прямо, часть «изучения Win32 API» — не лучший технический опыт в моей жизни.

С одной стороны, Win32 API — это довольно круто.Это похоже на расширение стандартного API C (кому нужно fopen когда ты сможешь иметь CreateFile.Но я думаю, что UNIX/Linux/WhateverOS имеют одни и те же функции.В любом случае, в Unix/Linux есть фраза «Все — это файл».В Windows есть надпись «Все есть...Окно» (без шуток!Видеть CreateWindow!).

С другой стороны, это устаревший API.Вы будете иметь дело с сырым C и безумием сырого C.

  • Это как сообщить своей структуре ее собственный размер, чтобы она могла пройти через void * указатель на некоторую функцию Win32.
  • Обмен сообщениями также может быть довольно запутанным:Смешение объектов C++ с окнами Win32 приводит к очень интересным примерам. Курица или яйцо проблема (смешные моменты, когда пишешь что-то вроде delete this ; в методе класса).
  • Необходимость создания подкласса WinProc, когда вы лучше знакомы с наследованием объектов, является головокружительной и неоптимальной.
  • И, конечно, радость»Почему в этом мире гидроразрыва они сделали это таким образом??«моменты, когда вы слишком много ударяете головой по клавиатуре и возвращаетесь домой с клавишами, выгравированными на лбу, только потому, что кто-то посчитал более логичным написать API, позволяющий изменять цвет «Окна», а не путем изменив одно из его свойств, но запросив его у родительского окна.
  • и т. д.

В последней раздаче(три руки???), учтите, что некоторые люди, работающие с устаревшими API, сами используют устаревшие стили кода.В тот момент, когда ты услышишь "const это для чайников" или "Я не использую пространства имен, потому что они снижают скорость выполнения."или еще лучше"Эй, кому нужен C++?Я пишу на своем собственном объектно-ориентированном языке C!!!" (Без шуток...В профессиональной среде, и результат был просто зрелищем...), вы почувствуете тот страх, который испытывают только осужденные перед гильотина.

Так...В общем, это интересный опыт.

Редактировать

Перечитав этот пост, я понимаю, что его можно расценить как чрезмерно негативный.Это не.

Иногда интересно (а также и неприятно) знать, как все работает под капотом.Вы поймете, что, несмотря на огромные (невозможные?) ограничения, команда Win32 API проделала замечательную работу, чтобы гарантировать, что все, от вашей «старой программы Win16» до вашего «последнего дополнительного приложения Win64», может работать вместе. в прошлом, сейчас и в будущем.

Вопрос в том:Вы действительно этого хотите?

Потому что тратить недели на то, что можно было бы сделать (и сделать лучше) с помощью другого, более высокоуровневого и/или объектно-ориентированного API, может быть весьма демотивирующим (опыт из реальной жизни:3 недели для Win API против 4 часов на трех других языках и/или библиотеках).

В любом случае, вы найдете блог Рэймонда Чена очень интересным из-за его инсайдерского взгляда на Win API и его эволюцию на протяжении многих лет:

https://blogs.msdn.microsoft.com/oldnewthing/

Абсолютно.Когда никто не знает низкого уровня, кто будет обновлять и писать языки высокого уровня?Кроме того, когда вы понимаете низкоуровневые вещи, вы можете писать более эффективный код на языке более высокого уровня, а также более эффективно отлаживать.

Собственные API — это «настоящие» API операционной системы.Библиотека .NET (за некоторыми исключениями) представляет собой не более чем причудливую обертку вокруг них.Так что да, я бы сказал, что любой, кто может понять .NET со всей его сложностью, может понять относительно обыденные вещи, такие как общение с API, без помощи посредника.

Просто попробуйте выполнить инъекцию DLL из управляемого кода.Это невозможно сделать.Вам придется писать собственный код для этого, для настройки окон, для реального создания подклассов и дюжины других вещей.

Так да:вы должны (должны) знать оба.

Редактировать:даже если вы планируете использовать P/Invoke.

Предположим, что вы создаете приложения, ориентированные на Windows:

  • Конечно, может быть полезно понять более низкие уровни системы - как они работают, как ваш код взаимодействует с ними (даже если только косвенно) и где у вас есть дополнительные параметры, которые недоступны в абстракциях более высокого уровня.
  • бывают случаи, когда ваш код может быть недостаточно эффективным, высокопроизводительным или точным для ваших требований.
  • Однако во все большем количестве случаев такие люди, как мы (которые никогда не изучали «неуправляемое кодирование»), смогут выполнить то программирование, которое мы пытаемся выполнить, без «изучения» Win32.
  • Кроме того, существует множество сайтов, которые предоставляют рабочие образцы, фрагменты кода и даже полнофункциональный исходный код, который вы можете «использовать» (заимствовать, заниматься плагиатом — но проверять, соблюдаете ли вы любую лицензию на повторное использование или авторские права!), чтобы заполнить во всех пробелах, которые не обрабатываются библиотеками классов .NET Framework (или библиотеками, которые вы можете загрузить или лицензировать).
  • Если вы можете добиться того, что вам нужно, не возясь с Win32, и вы хорошо справляетесь с разработкой хорошо сформированного, читаемого управляемого кода, то я бы сказал, что освоение .NET будет лучшим выбором, чем распыляться. в двух совершенно разных средах.
  • Если вам часто приходится использовать те функции Windows, которые не получили должного освещения в библиотеке классов Framework, то непременно приобретите необходимые навыки.
  • Лично я потратил слишком много времени, беспокоясь о «других областях» программирования, которыми я занимаюсь. предполагаемый понимать, чтобы создавать «хорошие программы», но есть много мазохистов, которые думают, что потребности и желания каждого такие же, как и его собственные.Страдание любит компанию.:)

При условии, что вы создаете приложения для мира «Web 2.0» или это будет так же полезно/выгодно для пользователей *NIX и MacOS:

  • Придерживайтесь языков и компиляторов, ориентированных на как можно большее количество кроссплатформенных сред.
  • Очевидно, что чистый .NET в Visual Studio лучше, чем Win32, но разработка с использованием библиотек MONO, возможно, с использованием Sharp Develop IDE, вероятно, будет даже лучшим подходом.
  • вы также можете потратить свое время на изучение Java, и эти навыки очень хорошо перенесутся в программирование на C# (плюс код Java теоретически будет работать на любой платформе с соответствующей JRE).Я слышал, что Java больше похож на «напиши один раз, отлаживай везде», но это, вероятно, так же верно (или даже больше), как и C#.

Аналогия:Если вы зарабатываете на жизнь сборкой автомобилей (программированием), то очень важно знать, как работает двигатель (Win32).

Простой ответ: ДА.

Это ответ на любой вопрос типа.. «имеет ли смысл изучать язык низкого уровня/API X, даже если есть язык более высокого уровня/API Y»

ДА

Вы можете загрузить свой компьютер с Windows (или любой другой ОС) и задать этот вопрос в SO, потому что пара ребят из Microsoft написали 16-битный ассемблерный код, который загружает вашу ОС.

Ваш браузер работает, потому что кто-то написал ядро ​​ОС на языке C, которое обслуживает все запросы вашего браузера.

Это касается вплоть до языков сценариев.

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

Никакой API/язык на любом уровне абстракции не имеет значения. если только нет лучшего, конкурирующего на том же уровне.

Другой взгляд на это:Хороший пример из одной из книг Майкла Абраша:Программисту на языке C было поручено написать функцию очистки экрана.Поскольку C был лучшей абстракцией (более высокого уровня) по сравнению с ассемблером и всем остальным, программист знал только C, и знал его хорошо.Он сделал все, что мог - переместил курсор в каждую точку экрана и очистил там персонажа.Он оптимизировал цикл и позаботился о том, чтобы он работал как можно быстрее.Но все равно это было медленно...пока какой-то парень не пришел и не сказал, что есть какая-то инструкция BIOS/VGA или что-то, что может мгновенно очистить экран.

Всегда полезно знать, по чему идешь.

Да, по нескольким причинам:

1) .net оборачивает код Win32..net обычно является лучшей системой для кодирования, но знание базового уровня Win32 (упс, WinAPI теперь, когда есть и 64-битный код) укрепляет ваши знания о том, что происходит на самом деле.

2) в этой экономике лучше иметь некоторые преимущества перед другим парнем, когда вы ищете работу.Некоторый опыт WinAPI может предоставить вам это.

3) некоторые системные аспекты пока недоступны через .net framework, и если вы хотите получить доступ к этим функциям, вам нужно будет использовать p/invoke (см. http://www.pinvoke.net за некоторую помощь там).Наличие хотя бы небольшого опыта работы с WinAPI сделает ваши усилия по разработке p/invoke намного более эффективными.

4) (добавлено) Теперь, когда Win8 существует уже некоторое время, она все еще построен на основе WinAPI.iOS, Android, OS/X и Linux доступны, но WinAPI будет существовать еще много-много лет.

Изучение нового языка программирования или технологии возможно по одной из трех причин:
1.Нуждаться:вы начинаете проект по созданию веб-приложения и ничего не знаете об ASP.NET
2.Энтузиазм:вы очень воодушевлены ASP.NET MVC.почему бы не попробовать это?
3.Свободное время:но у кого это вообще есть.

Лучшая причина узнать что-то новое – это Необходимость.Если вам нужно сделать что-то, чего не может сделать платформа .NET (например, производительность), то WinAPI — ваше решение.А пока мы будем заняты изучением .NET.

Для большинства задач на настольном компьютере вам не нужно знать Win32, однако МНОГО Win32 нет в .NET, но он находится в расходных материалах, которые могут в конечном итоге составлять менее 1% вашего приложения.

Поддержка USB, поддержка HID, Windows Media Foundation просто пришла мне в голову.Существует множество интересных API-интерфейсов Vista, доступных только из Win32.

Если вы занимаетесь настольным программированием, вы окажете себе большую услугу, научившись взаимодействовать с Win32 API, потому что, когда вам действительно понадобится вызвать Win32, а вы это сделаете, вам не придется тратить недели на то, чтобы почесать голову.

Лично мне не очень нравится API Win32, но его изучение имеет смысл, поскольку API обеспечит больший контроль и эффективность использования графического пользовательского интерфейса, чем такой язык, как Visual Basic, и я считаю, что если вы собираетесь зарабатывать на жизнь написанием программного обеспечения вы должны знать API, даже если вы не используете его напрямую.Это происходит по причинам, аналогичным причинам, по которым полезно изучать C, например, почему strcpy занимает больше времени, чем копирование целого числа, или почему вы должны использовать указатели на массивы в качестве параметров функции, а не массивы по значению.

Изучение C или языка более низкого уровня определенно может быть полезным.Однако я не вижу явного преимущества в использовании неуправляемого WinAPI.

Я видел низкоуровневый код Windows API...это некрасиво...Мне хотелось бы отучиться от этого.Я думаю, что полезно изучать низкий уровень, например, C, поскольку вы лучше понимаете аппаратную архитектуру и то, как все это работает.Изучение старого Windows API...Я думаю, что это можно оставить людям в Microsoft, которым, возможно, понадобится изучить это для создания языков более высокого уровня и API...построили, пусть мучаются с этим ;-)

Однако, если вам случится оказаться в ситуации, когда вы почувствуете, что просто не можете делать то, что вам нужно, на языке более высокого уровня (немногие и редкие), тогда, возможно, начните опасное погружение в этот мир.

да.взгляните на uTorrent, удивительно эффективное программное обеспечение.Половина его небольшого размера связана с тем, что большая часть его основных компонентов была переписана, чтобы не использовать гигантские библиотеки.

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

Важно знать, что доступно с помощью Windows API.Я не думаю, что вам нужно писать с его помощью код, но вы должны знать, как это работает..NET Framework содержит множество функций, но не предоставляет эквивалентов управляемого кода для всего Windows API.Иногда вам нужно подойти немного ближе к металлу, и знание того, что там внизу и как оно ведет себя, поможет вам лучше понять, как его использовать.

На самом деле это то же самое, что и вопрос, следует ли мне изучать язык низкого уровня, такой как C (или даже ассемблер).

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

Также может быть лучше, когда что-то не работает хорошо, недостаточно быстро или с той степенью детализации, которая вам нужна.(И сделайте хотя бы подклассы и суперклассы.)

Я скажу так.Мне не нравится программировать Win32 API.Это может быть проблемой по сравнению с управляемым кодом.НО, я рад, что знаю это, потому что я могу писать программы, которые иначе я бы не смог.Я могу писать программы, которые другие люди не могут.Кроме того, это дает вам больше информации о том, что ваш управляемый код делает за кулисами.

Величина пользы, которую вы получите от изучения Win32 API (помимо общих знаний, которые вы получите, узнав о том, как гайки и болты машины соединяются друг с другом), зависит от того, чего вы пытаетесь достичь.Большая часть Win32 API, но не вся, красиво упакована в библиотечные классы .NET.Если, например, вы хотите серьезно заняться аудиопрограммированием, эта часть Win32 API станет отличным предметом изучения, поскольку из классов .NET доступны только самые базовые операции.Последний раз, когда я проверял, даже управляемая библиотека DirectX DirectSound была ужасной.


Рискуя бесстыдной саморекламой....

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

Даже в языках очень высокого уровня вы все равно используете API.Почему?Да, не каждый аспект API был воспроизведен различными библиотеками, фреймворками и т. д.Вам необходимо изучать API до тех пор, пока он понадобится вам для выполнения того, что вы пытаетесь сделать.(И больше нет.)

За исключением некоторых особых случаев, когда вам нужен прямой доступ к API, я бы сказал НЕТ.

Чтобы научиться правильно реализовывать собственные вызовы API, требуется немало времени и усилий, а возвращаемое значение того не стоит.Я бы предпочел потратить время на изучение какой-нибудь новой актуальной технологии или фреймворка, который сделает вашу жизнь проще и программирование станет менее болезненным.Не устаревшие COM-библиотеки десятилетней давности, которые больше никто не использует (извините пользователей COM).

Пожалуйста, не побивайте меня камнями за этот взгляд.Я знаю, что у многих инженеров здесь очень любознательная душа, и нет ничего плохого в том, чтобы узнать, как все работает.Любопытство – это хорошо и действительно помогает пониманию.Но с управленческой точки зрения я бы предпочел потратить неделю на изучение того, как разрабатывать приложения для Android, чем на то, как вызывать OLE или COM.

Если вы планируете разработать кроссплатформенное приложение и используете Win32, ваше приложение может легко работать в Linux через WINE.В результате получается легко поддерживаемое приложение.Это одно из преимуществ изучения Win32.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top