Dela via


Windows API-uppsättningar

Viktig

Informationen i det här avsnittet gäller för alla versioner av Windows 10 och senare. Vi refererar till dessa versioner här som "Windows", och kallar eventuella undantag där det behövs.

Alla versioner av Windows delar en gemensam bas av operativsystemkomponenter (OS) som kallas core OS- (i vissa sammanhang kallas den här gemensamma basen även OneCore). I viktiga OS-komponenter är Win32-API:er ordnade i funktionella grupper som kallas API-uppsättningar.

Syftet med en API-uppsättning är att tillhandahålla en arkitekturavgränsning från värd-DLL där ett visst Win32-API implementeras och det funktionella kontrakt som API:et tillhör. Den avkoppling som API-uppsättningar ger mellan implementering och kontrakt erbjuder många tekniska fördelar för utvecklare. I synnerhet kan användning av API-uppsättningar i koden förbättra kompatibiliteten med Windows-enheter.

API-uppsättningar hanterar specifikt följande scenarier:

  • Även om den fullständiga bredden i Win32-API:et stöds på datorer är endast en delmängd av Win32-API:et tillgänglig på andra Windows-enheter som HoloLens, Xbox och andra enheter. API-uppsättningens namn tillhandahåller en frågemekanism för att identifiera om ett API är tillgängligt på en viss enhet.

  • Vissa Win32 API-implementeringar finns i DLL:er med olika namn på olika Windows-enheter. Att använda API-uppsättningsnamn i stället för DLL-namn vid identifiering av API-tillgänglighet och fördröjning vid inläsning av API:er ger en korrekt väg till implementeringen oavsett var API:et faktiskt implementeras.

Mer information finns i API set loader operation and Detect API set availability.

Är API-uppsättningar och dlls samma sak?

Nej – ett API-uppsättningsnamn är ett virtuellt alias för en fysisk .dll fil. Det är en implementeringsgömningsteknik där du som anropare inte behöver veta exakt vilken modul som är värd för informationen.

Tekniken gör att moduler kan omstruktureras (delas upp, konsolideras, byta namn och så vidare) i olika Windows-versioner och utgåvor. Och dina appar länkar fortfarande och dirigeras fortfarande till rätt kod vid körning.

Så varför har API-uppsättningar .dll i sina namn? Orsaken är hur DLL-inläsare implementeras. Inläsaren är den del av operativsystemet som läser in DLL:er och/eller löser referenser till DLL:er. Och i klientdelen kräver inläsaren att alla strängar som skickas till LoadLibrary avslutas med ".dll". Men efter den klientdelen kan inläsaren ta bort suffixet och köra frågor mot API-uppsättningens databas med den resulterande strängen.

LoadLibrary- (och fördröjningsbelastning) lyckas med ett API-uppsättningsnamn (med ".dll" i). men det finns inte nödvändigtvis en faktisk fil med det namnet någonstans på datorn.

Länka paraplybibliotek

För att göra det enklare att begränsa koden till Win32-API:er som stöds i kärnoperativsystemet tillhandahåller vi en serie paraplybibliotek. Ett paraplybibliotek med namnet OneCore.lib tillhandahåller till exempel exporter för den delmängd av Win32-API:er som är gemensamma för alla Windows-enheter.

Mer information finns i Windows-paraplybibliotek.

Namn på API-uppsättningskontrakt

API-uppsättningar identifieras med ett starkt kontraktnamn som följer dessa standardkonventioner som identifieras av biblioteksinläsaren.

  • Namnet måste börja antingen med strängen api- eller ext-.
    • Namn som börjar med api– representerar API:er som finns i alla Windows-utgåvor som uppfyller API:ets versionskrav.
    • Namn som börjar med ext – representerar API:er som kanske inte finns i alla Windows-utgåvor.
  • Namnet måste sluta med sekvensen l<n>-<n>-<n>, där n består av decimaltal.
  • Namnets brödtext kan vara alfanumeriska tecken eller bindestreck (-).
  • Namnet är skiftlägesokänsligt.

Här är några exempel på API-uppsättningskontraktnamn:

  • 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

Du kan använda ett API-uppsättningsnamn i kontexten för en inläsningsåtgärd, till exempel LoadLibrary- eller P/Invoke- i stället för ett DLL-modulnamn för att säkerställa en korrekt väg till implementeringen oavsett var API:et faktiskt implementeras på den aktuella enheten. Men när du gör detta måste du lägga till strängen .dll i slutet av kontraktnamnet. Detta är ett krav för att lastaren ska fungera korrekt och anses inte vara en del av kontraktsnamnet. Även om kontraktnamnen liknar DLL-namn i den här kontexten skiljer de sig i grunden från DLL-modulnamn och refererar inte direkt till en fil på disken.

Förutom att lägga till strängen .dll i inläsningsåtgärder bör NAMN på API-uppsättningskontrakt betraktas som en oföränderlig identifierare som motsvarar en viss kontraktsversion.

Identifiera API-uppsättningar för Win32-API:er

Om du vill ta reda på om ett visst Win32-API tillhör en API-uppsättning läser du kravtabellen i referensdokumentationen för API:et. Om API:et tillhör en API-uppsättning visar kravtabellen i artikeln API-uppsättningens namn och den Windows-version där API:et först introducerades i API-uppsättningen. Exempel på API:er som tillhör en API-uppsättning finns i följande artiklar:

I det här avsnittet