Delen via


Windows API-sets

Belangrijk

De informatie in dit onderwerp is van toepassing op alle versies van Windows 10 en hoger. We verwijzen hier naar deze versies als 'Windows', waarbij eventuele uitzonderingen waar nodig worden aangeroepen.

Alle versies van Windows delen een gemeenschappelijke basis van onderdelen van het besturingssysteem (OS) die het kernbesturingssysteem worden genoemd (in sommige contexten wordt deze algemene basis ook wel OneCoregenoemd). In kernonderdelen van het besturingssysteem worden Win32-API's ingedeeld in functionele groepen met de naam API-sets.

Het doel van een API-set is om een architectuurscheiding te bieden van de host-DLL waarin een bepaalde Win32-API wordt geïmplementeerd en het functionele contract waartoe de API behoort. De ontkoppeling die API-sets bieden tussen implementatie en contracten biedt veel technische voordelen voor ontwikkelaars. Met name het gebruik van API-sets in uw code kan de compatibiliteit met Windows-apparaten verbeteren.

API-sets hebben specifiek betrekking op de volgende scenario's:

  • Hoewel de volledige breedte van de Win32-API wordt ondersteund op pc's, is er slechts een subset van de Win32-API beschikbaar op andere Windows-apparaten, zoals HoloLens, Xbox en andere apparaten. De naam van de API-set biedt een querymechanisme om op schone wijze te detecteren of een API beschikbaar is op een bepaald apparaat.

  • Sommige Win32 API-implementaties bestaan in DLL's met verschillende namen op verschillende Windows-apparaten. Het gebruik van API-setnamen in plaats van DLL-namen bij het detecteren van API-beschikbaarheid en het vertragen van het laden van API's bieden een juiste route naar de implementatie, ongeacht waar de API daadwerkelijk wordt geïmplementeerd.

Zie API set loaderbewerking en Detect API set availabilityvoor meer informatie.

Zijn API-sets en dll's hetzelfde?

Nee: een naam van een API-set is een virtuele alias voor een fysiek .dll-bestand. Het is een techniek voor het verbergen van implementaties, waarbij u als aanroeper niet precies hoeft te weten welke module de informatie host.

Met de techniek kunnen modules worden geherstructureerd (gesplitst, geconsolideerd, hernoemd, enzovoort) in verschillende Windows-versies en -edities. En uw apps worden nog steeds gekoppeld en worden tijdens runtime nog steeds doorgestuurd naar de juiste code.

Waarom hebben API-sets .dll in hun namen? De reden hiervoor is de manier waarop het DLL-laadprogramma wordt geïmplementeerd. Het laadprogramma is het onderdeel van het besturingssysteem dat DLL's laadt en/of verwijzingen naar DLL's oplost. En aan de front-end vereist de laadprogramma een tekenreeks die wordt doorgegeven aan LoadLibrary- worden beëindigd met ".dll". Maar na die front-end kan het laadprogramma dat achtervoegsel weghalen en een query uitvoeren op de API-setdatabase met de resulterende tekenreeks.

LoadLibrary- (en vertragingsbelasting) slaagt met een API-setnaam (met daarin de.dll); maar er is niet noodzakelijkerwijs een echt bestand met die naam ergens op de pc.

Paraplubibliotheken koppelen

Om het eenvoudiger te maken om uw code te beperken tot Win32-API's die worden ondersteund in het kernbesturingssystemen, bieden we een reeks paraplubibliotheken. Een paraplubibliotheek met de naam OneCore.lib biedt bijvoorbeeld de exports voor de subset van Win32-API's die gebruikelijk zijn voor alle Windows-apparaten.

Zie Windows-paraplubibliothekenvoor meer informatie.

Contractnamen voor API-set

API-sets worden geïdentificeerd door een sterke contractnaam die volgt op deze standaardconventies die worden herkend door het bibliotheeklaadprogramma.

  • De naam moet beginnen met de tekenreeks api- of ext-.
    • Namen die beginnen met API- API's vertegenwoordigen die bestaan in alle Windows-edities die voldoen aan de versievereisten van de API.
    • Namen die beginnen met ext- vertegenwoordigen API's die mogelijk niet bestaan in alle Windows-edities.
  • De naam moet eindigen met de reeks l<n>-<n>-<n>, waarbij n uit decimalen bestaat.
  • De hoofdtekst van de naam kan alfanumerieke tekens of streepjes (-) zijn.
  • De naam is niet hoofdlettergevoelig.

Hier volgen enkele voorbeelden van api-set contractnamen:

  • 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

U kunt een API-setnaam gebruiken in de context van een laadprogramma, zoals LoadLibrary of P/Invoke in plaats van een DLL-modulenaam om een juiste route naar de implementatie te garanderen, ongeacht waar de API daadwerkelijk op het huidige apparaat wordt geïmplementeerd. Wanneer u dit echter doet, moet u de tekenreeks toevoegen .dll aan het einde van de contractnaam. Dit is een vereiste van het laadprogramma om goed te functioneren en wordt niet beschouwd als een deel van de contractnaam. Hoewel contractnamen lijken op DLL-namen in deze context, zijn ze fundamenteel anders dan DLL-modulenamen en verwijzen ze niet rechtstreeks naar een bestand op schijf.

Met uitzondering van het toevoegen van de tekenreeks .dll in laadprogrammabewerkingen, moeten contractnamen van DE API-set worden beschouwd als een onveranderbare id die overeenkomt met een specifieke contractversie.

API-sets voor Win32-API's identificeren

Als u wilt bepalen of een bepaalde Win32-API deel uitmaakt van een API-set, raadpleegt u de vereistentabel in de referentiedocumentatie voor de API. Als de API deel uitmaakt van een API-set, worden in de vereistentabel in het artikel de naam van de API-set en de Windows-versie vermeld waarin de API voor het eerst is geïntroduceerd in de API-set. Zie de volgende artikelen voor voorbeelden van API's die deel uitmaken van een API-set:

In deze sectie