Какая связь между C и Windows API? - PullRequest
7 голосов
/ 25 июня 2010

Я посмотрел на некоторые другие вопросы о SO, и неясно, построен ли c поверх, под или рядом с WINAPI. Как, например, кто-то может написать что-то на чистом c, чтобы открыть окно, или ему нужно будет использовать windows api?

Я заметил сходство между версией c (library?) Открытия файла (fopen) и версией Windows API (CreateFile), которая заставляет меня задаться вопросом, является ли одна оболочкой для другой. Кто-нибудь знает?

Если окна запущены; ли программист вынужден программировать, используя Windows API, чтобы запустить что-то на нем, или программист вообще не может использовать API Windows и напрямую получать доступ к оборудованию (т. е. защищает ли операционная система Windows доступ к оборудованию)?

Что является более переносимым между различными версиями окон Windows CE. В найденной мной документации (которая теперь изменилась) говорилось, что CreateFile возвращается только к версии 2.0 Windows CE (здесь: http://msdn.microsoft.com/en-us/library/ms959950.aspx - Обратите внимание на примечание к ссылке в самом низу, которое показывает, что информация о поддерживаемой версии была изменена). Так что же следует использовать для Windows CE версии 1? Другими словами, программирование с использованием функций c или функций, помеченных как WINAPI, более вероятно, будет работать на всех версиях Windows CE?

Я прочитал следующее в книге о программировании Windows CE, и это сбило меня с толку, так что все вышеперечисленные вопросы можно лучше понять в контексте понимания следующего:

Windows CE поддерживает большинство функций ввода-вывода файлов, которые есть в Windows NT и Windows 98. Поддерживаются все те же вызовы Win32 API, как CreateFile, ReadFile, WriteFile и CloseFile. Однако программист Windows CE должен знать о некоторых различиях. Во-первых, стандартные функции ввода-вывода для файла C, такие как fopen, fread и fprintf, не поддерживаются в Windows CE. Аналогично, старые стандарты Win16, _lread, _lwrite и _llseek, не поддерживаются. Это не очень большая проблема, потому что все эти функции могут быть легко реализованы путем обертывания файловых функций Windows CE небольшим количеством кода.

Мое понимание переноса состоит в том, что вам нужно что-то обернуть, учитывая, как получается, что библиотеки win16 и c недоступны, он заявляет об обёртывании функции CreateFile, чтобы сделать вашу собственную c-подобную версию fopen? (Единственное, что мне известно, это сборка, и если бы он предлагал ее обернуть, то она не была бы написана таким случайным образом.)

Учитывая вышесказанное, каковы отношения зависимостей между языком c (синтаксис, структуры данных, управление потоком), библиотекой функций c (например, fopen) и API-интерфейсом Windows (например, CreateFile)?

Ответы [ 10 ]

17 голосов
/ 25 июня 2010

C существовал задолго до появления Windows. Windows API - это набор библиотек, написанных на языке C. Может или не может быть возможно дублировать его функциональность самостоятельно, в зависимости от того, что Microsoft документировала или сделала доступной через API. На некотором уровне вполне вероятно, что fopen() и CreateFile() каждый вызывает одну и ту же или похожую службу операционной системы, но маловероятно, что один является строгой оболочкой для другого. Вероятно, было бы трудно обойти Windows API для прямого доступа к оборудованию, но все возможно при достаточном времени и усилиях по программированию.

10 голосов
/ 25 июня 2010

C ничего не знает о графических интерфейсах, и ОЧЕНЬ мало о операционных системах вообще.Все, что вы делаете для графики в C, - это использование библиотек, примером которых является API Win32.

5 голосов
/ 25 июня 2010

Windows API реализован на языке программирования Си. Функциональность, предоставляемая стандартными библиотеками C, такими как fopen, является переносимой, поскольку она компилируется в соответствующий код сборки для разных архитектур различными компиляторами. Функции Windows API, такие как CreateFile, работают только на компьютерах под управлением Windows и поэтому не являются переносимыми.

4 голосов
/ 25 июня 2010

Теоретически можно написать C, который взаимодействует напрямую с аппаратным обеспечением. Во времена MS-DOS (для одного примера) довольно многие из нас делали это довольно регулярно (поскольку MS-DOS просто не предоставляла то, что нам было нужно). Редактировать: В некоторых небольших встроенных системах это все еще довольно распространенное явление, но в типичных настольных системах это практически исчезло.

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

Да, большая часть библиотеки C использует базовую ОС, поэтому (например) в Windows fopen и fwrite в конечном итоге вызовут CreateFile и WriteFile, но в Linux они в конечном итоге вызовут open и write вместо.

2 голосов
/ 25 июня 2010

Я заметил сходство между версией c (библиотека?) Открытия файла (fopen) и версией Windows API (CreateFile)

Не удивительно.Они делают подобные вещи.

[это] один - просто обертка для другого?Кто-нибудь знает?

Вы не можете узнать, потому что исходный код принадлежит и хранится в качестве коммерческой тайны.Неважно, что является более «фундаментальным».Вы используете Windows API из программы Windows.Вы используете C API из программ на C.

Обратите внимание, что это не имеет значения.Вы можете использовать смешанный API C или Windows API.

Если запущены окна;Кто-то вынужден использовать Windows API, чтобы запустить что-то на нем, или они могут полностью обойти Windows и получить прямой доступ к оборудованию?

«Прямой доступ к оборудованию»?Что это значит?Если Windows работает, то ... ну ... Windows работает.Windows обеспечивает ваш доступ к оборудованию.

Используйте bootcamp, GRUB или другой загрузчик, чтобы обойти Windows и иметь «прямой доступ к оборудованию».

Если они могут, то этоВозможно ли повредить оборудование, если вы не знаете, что делаете?

Что это значит?Вы спрашиваете, можете ли вы «повредить» некоторые вращающиеся носители (например, диски), неправильно используя их драйверы?Вы можете повредить ваш жесткий диск независимо от того, какую ОС вы используете или не используете.Привилегированная учетная запись и тупое программное обеспечение могут записывать неверные данные на диск.Это считается "ущербом"?

Что является более переносимым?

Что это значит?На другой компьютер с Windows?На компьютер не работает Windows?О чем ты спрашиваешь?Пожалуйста, уточните свой вопрос, чтобы определить, что вы подразумеваете под «переносимым».

между различными версиями Windows

Поскольку разные Windows являются взаимно несовместимыми, я обычно предлагаю использовать толькоСтандартные библиотеки POSIX и отказ от всех API Windows.

Однако некоторые варианты Windows (например, Windows Mobile для телефона или Windows Server) по существу полностью несовместимы.Существует очень мало причин для запуска какого-либо программного обеспечения на обеих ОС.Портативность не имеет большого значения.Зачем пытаться запустить приложение телефона на сервере?


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

Итак, в нижней части находится язык c (ближайший к аппаратному обеспечению), затем Windows API следующийтогда библиотека C поверх Windows API?

Это не имеет смысла.Вы смешиваете две несвязанные вещи.«Язык» и «библиотеки» имеют мало общего друг с другом.

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

Вот способ взглянуть на это.

  • Операционная система WindowsСистема имеет несколько API.Существуют базовые библиотеки функций, которые не являются частью интерфейса application .Они "внутренние".
  • Имеет встроенный Windows API.Вызывается из C.
  • Имеет API POSIX.Вызывается из C. В некоторых случаях API Posix обычно использует Windows API.
1 голос
/ 25 июня 2010

WINAPI предоставляет интерфейс, который разработчики на C могут использовать для использования функциональности WINAPI. Программы на C ++ также могут его использовать.

1 голос
/ 25 июня 2010

Большинство операционных систем, включая Windows, написаны на C (или ассемблере).Затем библиотека модифицируется для каждой операционной системы для выполнения основных задач.(Сокеты, файлы, память и т. Д.).

WINAPI - это просто набор библиотек (написанных на C и / или Assembler), которые обеспечивают доступ к функциям в ОС.

Это не связано с Windows, после того, как вы изменили свой вопрос, я думаю, что вы пытаетесь понять, является ли загрузка операционной системы (Windows или другая).
В книге «Разработка и внедрение операционных систем» обсуждаетсяреализация Minix (на которой основан Linux).

0 голосов
/ 25 июня 2010

Как забавное замечание, вы действительно можете разобраться с «мощью» Windows API, взглянув на AutoIt http://www.autoitscript.com/autoit3/.AutoIt - отличный маленький скриптовый язык, который может создавать GUI, запускать приложения командной строки, управлять окнами и процессами и т. Д. Да, он выполняет файловый ввод-вывод и работу в сети.

0 голосов
/ 25 июня 2010

Карл Норум отметил, что C существовал задолго до Windows, но не забывайте, что интерфейс Windows API начинался с API MS-DOS, который начинался с API CP / M. C существовал только незадолго до CP / M.

Множество ответов, похоже, подразумевают, что Windows API построен на C, но это тоже кажется сомнительным. __stdcall является синонимом PASCAL, который был ключевым словом в компиляторах C Microsoft, поскольку Windows API был построен на Pascal. __cdecl - это значение по умолчанию для вызовов функций в программах на C и C ++, скомпилированных Visual Studio, но оно не работает при вызовах API.

Связь между C и Windows API заключается в том, что они способны работать друг с другом.

0 голосов
/ 25 июня 2010

Операционные системы, такие как Windows, содержат библиотеки WINAPI, которые предоставляют доступ к некоторым функциям операционной системы и иногда связываются с аппаратным обеспечением, эти библиотеки написаны на C

...