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

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

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

+49
08 авг. '08 в 0:29
источник поделиться
22 ответа

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

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

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

Ура!

+58
08 авг. '08 в 1:00
источник

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

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

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

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

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

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

Изменить

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

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

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

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

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

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

+20
19 сент. '08 в 18:37
источник

Связанные вопросы


Похожие вопросы

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

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

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

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

+15
08 авг. '08 в 0:53
источник

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

+14
08 авг. '08 в 0:31
источник

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

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

В предположении, что вы создаете приложения для мира "Web 2.0", или это было бы так же полезно и полезно для пользователей NIX и MacOS:

  • Придерживайтесь языков и компиляторов, нацеленных на максимально возможное количество межплатформенных сред.
  • чистый .NET в Visual Studio лучше, чем Win32, но разработка с использованием библиотек MONO, возможно, с использованием среды разработки Sharp Develop IDE, вероятно, является еще лучшим подходом.
  • вы также можете потратить свое время на изучение Java, и эти навыки очень хорошо переносятся на программирование на С# (плюс Java-код теоретически будет работать на любой платформе с соответствующей JRE). Я слышал, что он сказал, что Java больше похожа на "писать один раз, отлаживать всюду", но это, вероятно, так же верно, как (или даже более, чем) С#.
+11
09 авг. '08 в 20:27
источник

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

+9
08 авг. '08 в 1:01
источник

Простой ответ, YES.

+8
08 авг. '08 в 1:16
источник

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

Да

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

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

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

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

Нет api/language на любом уровне абстракции не имеет значения , если нет лучшего конкурента на том же уровне.

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

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

+7
29 мая '10 в 3:17
источник

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

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

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

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

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

+6
17 июл. '09 в 6:17
источник

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

+4
21 авг. '08 в 13:07
источник

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

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

+4
08 авг. '08 в 1:56
источник

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

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

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

+4
08 авг. '08 в 16:53
источник

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

+3
08 авг. '08 в 0:35
источник

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

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

+3
08 авг. '08 в 0:40
источник

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

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

+3
11 июн. '09 в 3:53
источник

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

+2
08 авг. '08 в 2:21
источник

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

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

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

+2
23 апр. '12 в 16:39
источник

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

+2
28 июн. '09 в 18:49
источник

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

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

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

+2
12 сент. '08 в 6:20
источник

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

+2
26 сент. '08 в 2:01
источник

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


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

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

+2
26 сент. '08 в 3:01
источник

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

+1
28 июн. '09 в 18:59
источник

Посмотрите другие вопросы по меткам или Задайте вопрос