Почему WinAPI так отличается от “нормального” C?

Лучший способ состоит в том, чтобы обеспечить электричеством Ваши события JavaScript, пользующиеся некоторой библиотекой JavaScript как jQuery или YUI, и поместить Ваш код во внешний .js-файл.

, Но если Вы хотите быстрое-и-грязное решение, это - Ваше встроенное решение HTML:


Обновленный : Добавленный требуемый материал окраски.

5
задан Inno 2 December 2009 в 15:52
поделиться

6 ответов

Оригинальный Windows API был разработан в период 1984-85 годов, более 25 лет назад. Венгерская нотация была в моде, поэтому нужно было указать тип переменной в объявлении. Например, в чистом C нет способа указать «дальний» указатель, что и указывает LP в LPCSTR, но в 1985 году было очень важно различать обычные указатели и дальние указатели. (Это значение отошло на второй план, когда 32-битные окна взяли верх в середине 90-х, но синтаксис сохранился ...)

Кроме того, C на самом деле не различает просто указатель на char и указатель на статическая строка. Таким образом, lpsz типы.

В конце концов, речь идет о более надежном и последовательном вводе параметров, чем допускал простой C в 1984 году. Что касается WinMain, то это ' s потому, что программа Windows существенно отличается от программы командной строки. Если вы посмотрите в библиотеку, вы, вероятно, найдете функцию main (), которая устанавливает параметры, а затем вызывает внешнюю функцию WinMain (то есть вашу).

15
ответ дан 18 December 2019 в 06:50
поделиться

Есть две основные причины:

  • Сложность. Язык C минимален, он предоставляет строительные блоки, на которых можно построить более сложные архитектуры. LPCSTR, BOOL и другие типы, которые вы найдете в Win32, являются определениями типов или структурами, построенными на основе C.
  • Ориентация на события. C обычно преподают в предположении, что ваша программа является проактивной и все контролирует. В событийно-ориентированной среде, такой как Windows (или любая другая ОС на основе графического интерфейса пользователя), ваша программа вызывается операционной системой, поэтому она обычно находится в цикле, ожидая прибытия сообщений.

API других ОС на основе графического интерфейса могут отличаться от Win32, потому что не существует единого решения, но проблема, которую они решают, та же самая.

4
ответ дан 18 December 2019 в 06:50
поделиться

Райманд Чен из Microsoft пишет в своем блоге :

Хотя функция WinMain задокументировано в Platform SDK, это не совсем часть платформы. Скорее WinMain - это обычный имя для точки входа, предоставленной пользователем в программу Windows.

Настоящая точка входа находится в C библиотека времени выполнения, которая инициализирует среда выполнения, запускает глобальные конструкторы и затем вызывает вашу функцию WinMain (или wWinMain, если вы предпочитаете запись Unicode точку).

2
ответ дан 18 December 2019 в 06:50
поделиться

Я бы сказал, что по большей части это вопрос стиля. Стандарты выросли из мира Unix, поэтому, например, библиотечные функции имеют короткие имена и не так много определений типов. Я предполагаю, что это отражает выбор разработчиков C и Unix. С другой стороны, в Windows есть LongFunctionNamesInMixedCase и LOTSOFTYPEDEFS , * PTYPEDEFSFORPOINTERSTOO

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

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

1
ответ дан 18 December 2019 в 06:50
поделиться

Они действительно не «пошли таким другим путем», как вы выразились.

WinMain () - это просто точка входа, которую ищет ОС Windows. Концептуально он ничем не отличается от main ().

Что касается определений символов (LPCSTR, BOOL и т. Д.), Это частично сделано для простоты использования. Например, написать LPCSTR короче, чем const char * . Другой пример - определение типа BOOL , которое не поддерживается языком C. Другая причина состоит в том, чтобы оградить разработчика от изменений в базовом оборудовании, например, от перехода с 16-битной на 32-битную архитектуру на 64-битную.

Ни в коем случае не следует считать этот ответ исчерпывающим. Это всего лишь пара вещей, которые я заметил при программировании с Win32 / MFC.

1
ответ дан 18 December 2019 в 06:50
поделиться

Программирование Windows API управляется событиями, тогда как до этого момента большая часть программирования на C была линейной. Таким образом, WinMain () - это ярлык для библиотек для написания с использованием функций ОС, в то время как main () является частью языка C.

Пока мы говорим об этом, C имеет несколько встроенных типов, и в то время , было несколько способов их обозначения. "Типы" окон (HWND, LPSTR, BOOL и т.д.) отражают типы данных, обычно используемые в программировании Windows, и пытаются указать программисту, какими будут типы данных.

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

0
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

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