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

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

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

8.08.2008 00:29:13
Кстати, это Petzold, а не Petzhold.
MarkJ 12.03.2009 22:59:41
Веб-приложения заменит приложение Windows. Веб-приложения работают через браузер. Браузер - это приложение для Windows.
Sesh 14.06.2009 16:53:05
Насосы сообщений - это сердце мира программирования.
GalacticJello 26.04.2012 06:50:36
22 ОТВЕТА
РЕШЕНИЕ

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

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

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

Ура!

61
8.08.2008 01:00:49

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

16
8.08.2008 00:31:04

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

3
8.08.2008 00:35:21

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

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

3
8.08.2008 00:40:05

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

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

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

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

16
8.08.2008 00:57:03

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

9
8.08.2008 01:01:44

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

8
8.08.2008 01:16:26

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

Лучшая причина узнать что-то новое - это Need. Если вам нужно сделать что-то, чего не может сделать .NET Framework (например, производительность), тогда WinAPI - ваше решение. До тех пор мы занимаемся изучением .NET

4
8.08.2008 01:56:33

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

2
8.08.2008 02:21:47

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

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

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

4
8.08.2008 16:53:50

Предполагая, что вы создаете приложения для 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 #.
11
9.08.2008 20:27:00

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

4
21.08.2008 13:07:30

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

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

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

2
12.09.2008 06:20:26

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

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

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

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

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

Итак ... В целом, это интересный опыт.

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

Перечитав этот пост, я вижу, что его можно считать слишком негативным. Не то.

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

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

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

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

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

22
15.06.2016 17:23:46
Вам не нужно использовать C ++, чтобы использовать win32api. Вы можете использовать Python или что-то, что не требует 15 строк дерьма управления памятью, прежде чем вы сможете выполнить простую задачу.
jle 22.02.2009 03:56:23
@jle: Да, но использование Win32 API через Python похоже на использование Win32 API через Java или C #: кто-то уже написал обертки для вас. Кроме того, я надеюсь, что вы не программируете GUI с Win32, потому что даже с python, это боль. И последнее, но не менее важное: в этом вопросе не упоминается ни Python (или любой другой язык сценариев), ни тег «python», так что ...
paercebal 19.10.2010 12:35:09

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

2
26.09.2008 02:01:45

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


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

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

2
23.05.2017 12:02:51

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

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

3
11.06.2009 03:53:11

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

2
28.06.2009 18:49:44

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

1
28.06.2009 18:59:47
Если вы намерены разработать кроссплатформенное приложение и рассмотреть Win32, вы не только стреляете себе в ногу. Вы сносите всю ногу. WINE в большинстве случаев отлично работает с приложениями Windows, но это не делает Win32 хорошим выбором для кроссплатформенной разработки. Кроме того, поскольку существует Mono, я подозреваю, что C # / .NET будет гораздо лучшим выбором для кросс-платформенных проблем.
Hannes Ovrén 17.07.2009 06:41:48
Как вы отлаживаете приложение .net в Linux? Если вы используете win32, вы можете использовать такие инструменты, как «ddd» в Linux.
Manohar 18.07.2009 17:06:14
Да, я не знал о моно, monodevelop, кажется, намного лучше, чем DDD. Я не знаю об отзывчивости пользовательского интерфейса, работающего на винах и моно BTW.
Manohar 22.07.2009 05:45:48

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

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 будет существовать еще много-много лет.

7
8.03.2014 00:03:23

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

ДА

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

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

Все идет вплоть до скриптовых языков.

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

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

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

Это всегда помогает узнать, по чему ты идешь.

7
29.05.2010 03:24:48

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

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

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

2
23.04.2012 16:39:30