Windows API 세트

중요

이 항목의 정보는 모든 버전의 Windows 10 이상에 적용됩니다. 여기서는 이러한 버전을 "Windows"라고 하며 필요한 경우 예외를 호출합니다.

모든 버전의 Windows는 핵심 OS라고 하는 OS(운영 체제) 구성 요소의 공통 기반을 공유합니다(일부 컨텍스트에서는 이 공통 기반을 OneCore이라고도 함). 핵심 OS 구성 요소에서 Win32 API는 API 집합이라는 기능 그룹으로 구성됩니다.

API 집합의 목적은 지정된 Win32 API가 구현되는 호스트 DLL과 API가 속한 기능 계약에서 아키텍처 분리를 제공하는 것입니다. API 집합이 구현과 계약 간에 제공하는 분리는 개발자에게 많은 엔지니어링 이점을 제공합니다. 특히 코드에서 API 집합을 사용하면 Windows 디바이스와의 호환성을 향상시킬 수 있습니다.

API 집합은 특히 다음 시나리오를 해결합니다.

  • Win32 API의 전체 범위는 PC에서 지원되지만 HoloLens, Xbox 및 기타 장치와 같은 다른 Windows 장치에서는 Win32 API의 하위 집합만 사용할 수 있습니다. API 집합 이름은 지정된 디바이스에서 API를 사용할 수 있는지 여부를 명확하게 검색하는 쿼리 메커니즘을 제공합니다.

  • 일부 Win32 API 구현은 여러 Windows 디바이스에서 이름이 다른 DLL에 존재합니다. API 가용성을 검색하고 API 로드를 지연할 때 DLL 이름 대신 API 집합 이름을 사용하면 API가 실제로 구현되는 위치에 관계없이 구현에 대한 올바른 경로를 제공합니다.

자세한 내용은 API 집합 로더 작업API 집합 가용성 검색을 참조하세요.

API 집합과 dll이 동일한가요?

아니요- API 집합 이름은 실제 .dll 파일의 가상 별칭입니다. 호출자로서 정보를 호스팅하는 모듈을 정확히 알 필요가 없는 구현 숨기기 기술입니다.

이 기술을 사용하면 다양한 Windows 버전 및 버전에서 모듈을 리팩터링(분할, 통합, 이름 바꾸기 등)할 수 있습니다. 앱은 여전히 연결되고 런타임에 올바른 코드로 라우팅됩니다.

그렇다면 API 집합이 이름에 있는 .dll 이유는 무엇일까요? 그 이유는 DLL 로더 가 구현되는 방식입니다. 로더는 DLL을 로드하고 DLL에 대한 참조를 확인하는 OS의 일부입니다. 그리고 프런트 엔드에서 로더는 LoadLibrary 에 전달된 문자열을 ".dll"로 종료해야 합니다. 그러나 프런트 엔드 후에는 로더가 해당 접미사를 제거하고 결과 문자열을 사용하여 API 집합 데이터베이스를 쿼리할 수 있습니다.

LoadLibrary (및 지연 로드)는 API 집합 이름(".dll")으로 성공합니다. 하지만 PC의 어느 곳에서나 해당 이름의 실제 파일이 반드시 있는 것은 아닙니다.

우산 라이브러리 연결

코드를 핵심 OS에서 지원되는 Win32 API로 쉽게 제한할 수 있도록 일련의 우산 라이브러리를 제공합니다. 예를 들어 라는 OneCore.lib 우산 라이브러리는 모든 Windows 디바이스에 공통적인 Win32 API의 하위 집합에 대한 내보내기를 제공합니다.

자세한 내용은 Windows 우산 라이브러리를 참조하세요.

API 집합 계약 이름

API 집합은 라이브러리 로더에서 인식하는 이러한 표준 규칙을 따르는 강력한 계약 이름으로 식별됩니다.

  • 이름은 문자열 api- 또는 ext-로 시작해야 합니다.
    • api-로 시작하는 이름은 모든 Windows 버전에 존재하도록 보장되는 API를 나타냅니다.
    • ext-로 시작하는 이름은 모든 Windows 버전에 존재하지 않을 수 있는 API를 나타냅니다.
  • 이름은 l<n-n-n>><>< 시퀀스로 끝나야 합니다. 여기서 n은 소수 자릿수로 구성됩니다.
  • 이름의 본문은 영숫자 문자 또는 대시(-)일 수 있습니다.
  • 이름은 대소문자를 구분하지 않습니다.

다음은 API 집합 계약 이름의 몇 가지 예입니다.

  • api-ms-win-core-ums-l1-1-0
  • ext-ms-win-com-ole32-l1-1-5
  • ext-ms-win-ntuser-window-l1-1-0
  • ext-ms-win-ntuser-window-l1-1-1

DLL 모듈 이름 대신 LoadLibrary 또는 P/Invoke 와 같은 로더 작업의 컨텍스트에서 API 집합 이름을 사용하여 API가 현재 디바이스에서 실제로 구현되는 위치에 관계없이 구현에 대한 올바른 경로를 보장할 수 있습니다. 그러나 이렇게 하면 계약 이름의 끝에 문자열 .dll 추가해야 합니다. 이는 로더가 제대로 작동하기 위한 요구 사항이며 실제로 계약 이름의 일부로 간주되지 않습니다. 계약 이름은 이 컨텍스트에서 DLL 이름과 비슷하게 표시되지만 기본적으로 DLL 모듈 이름과 다르며 디스크의 파일을 직접 참조하지는 않습니다.

로더 작업에서 문자열.dll 추가하는 경우를 제외하고 API 집합 계약 이름은 특정 계약 버전에 해당하는 변경할 수 없는 식별자로 간주되어야 합니다.

Win32 API에 대한 API 집합 식별

특정 Win32 API가 API 집합에 속하는지 여부를 식별하려면 API에 대한 참조 설명서의 요구 사항 테이블을 검토합니다. API가 API 집합에 속하는 경우 문서의 요구 사항 테이블에는 API 집합 이름과 API 집합에 API가 처음 도입된 Windows 버전이 나열됩니다. API 집합에 속하는 API의 예는 다음 문서를 참조하세요.

섹션 내용