Давайте начнем с пользовательского интерфейса. Какой пользовательский интерфейс? Интерфейс, в общем, является средством взаимодействия с программным обеспечением. Таким образом, пользовательский интерфейс - это то, что пользователи могут использовать для взаимодействия с программным обеспечением. Вы привыкли к графическому интерфейсу пользователя (GUI), но старые компьютеры и некоторые современные профессиональные программы используют интерфейс командной строки (CLI), где пользователь может вводить текстовые команды и получать результаты также в виде текста.
Есть также интерфейсы, которые не являются пользовательскими интерфейсами, т.е. они не предназначены для взаимодействия с людьми. Например, сетевые интерфейсы являются строго определенными средствами взаимодействия между двумя или более устройствами по сети. Адаптеры Ethernet и Wi-Fi предоставляют сетевые интерфейсы.
Наконец, есть API: интерфейсы прикладного программирования. Это интерфейсы, предоставляемые одним программным обеспечением, разработанным так, чтобы другие программы могли взаимодействовать с ним. Когда я хочу использовать какую-то библиотеку, я должен изучить ее API, т.е. какие функции он предоставляет и как я могу этим воспользоваться. Когда я хочу использовать фреймворк, я должен изучить его API, т.е. как я могу подключить свой собственный код в рамках.
Windows (и любая операционная система) - это платформа для запуска другого программного обеспечения. Программы запускаются Windows особым образом, они могут загружать библиотеки, взаимодействовать с другими программами, читать и записывать файлы, использовать оборудование, ждать определенных событий (нажатие клавиши, потеря окна и т.д.) ... Как видите, много всего. Все это более или менее обеспечивается Windows, но программы должны знать, как получить к нему доступ. Это Windows API.
Но какова структура этих .dll?
Там нет ни одного. Материал не всегда принадлежит к какой-то структуре. Первые компьютерные программы не использовали никаких фреймворков или даже библиотек, они были изобретены позже, чтобы сделать часто используемые фрагменты кода многократно используемыми вместо того, чтобы писать их снова и снова.