Set di API Di Windows
Importante
Le informazioni contenute in questo argomento si applicano a tutte le versioni di Windows 10 e versioni successive. Queste versioni verranno indicate qui come "Windows", richiamando eventuali eccezioni, se necessario.
Tutte le versioni di Windows condividono una base comune di componenti del sistema operativo (OS) chiamati sistema operativo core (in alcuni contesti questa base comune è anche denominata OneCore). Nei componenti principali del sistema operativo, le API Win32 sono organizzate in gruppi funzionali denominati set di API.
Lo scopo di un set di API è fornire una separazione dell'architettura dalla DLL host in cui viene implementata una determinata API Win32 e il contratto funzionale a cui appartiene l'API. Il disaccoppiamento offerto dai set di API tra implementazione e contratti offre molti vantaggi di progettazione per gli sviluppatori. In particolare, l'uso di set di API nel codice può migliorare la compatibilità con i dispositivi Windows.
I set di API riguardano in modo specifico gli scenari seguenti:
Anche se l'ampiezza completa dell'API Win32 è supportata nei PC, solo un subset dell'API Win32 è disponibile in altri dispositivi Windows, ad esempio HoloLens, Xbox e altri dispositivi. Il nome del set di API fornisce un meccanismo di query per rilevare in modo pulito se un'API è disponibile in un determinato dispositivo.
Alcune implementazioni dell'API Win32 esistono nelle DLL con nomi diversi in dispositivi Windows diversi. L'uso dei nomi dei set di API anziché dei nomi dll quando rileva la disponibilità dell'API e ritarda il caricamento delle API fornisce una route corretta all'implementazione indipendentemente dalla posizione in cui viene effettivamente implementata l'API.
Per altre informazioni, vedere Operazione del caricatore del set di API e Rilevare la disponibilità del set di API.
I set di API e le dll sono la stessa cosa?
No: il nome di un set di API è un alias virtuale per un file fisico .dll
. Si tratta di una tecnica di nascondimento dell'implementazione, in cui il chiamante non deve sapere esattamente quale modulo ospita le informazioni.
La tecnica consente il refactoring dei moduli (suddivisione, consolidamento, ridenominazione e così via) in diverse versioni e edizioni di Windows. E le app continuano a collegarsi e continuano a essere indirizzate al codice corretto in fase di esecuzione.
Perché i set di API hanno .dll
i nomi? Il motivo è il modo in cui viene implementato il caricatore DLL. Il caricatore è la parte del sistema operativo che carica le DLL e/o risolve i riferimenti alle DLL. E nel front-end, il caricatore richiede che qualsiasi stringa passata a LoadLibrary venga terminata con ".dll". Tuttavia, dopo tale front-end, il caricatore può rimuovere il suffisso ed eseguire query sul database del set di API con la stringa risultante.
LoadLibrary (e caricamento ritardato) ha esito positivo con un nome del set di API (con ".dll" in esso), ma non esiste necessariamente un file effettivo con tale nome in qualsiasi punto del PC.
Collegamento di librerie umbrella
Per semplificare la limitazione del codice alle API Win32 supportate nel sistema operativo principale, forniamo una serie di librerie generiche. Ad esempio, una libreria generica denominata OneCore.lib
fornisce le esportazioni per il subset di API Win32 comuni a tutti i dispositivi Windows.
Per altri dettagli, vedere Librerie generiche di Windows.
Nomi di contratto del set di API
I set di API sono identificati da un nome di contratto sicuro che segue queste convenzioni standard riconosciute dal caricatore di libreria.
- Il nome deve iniziare con la stringa api- o ext-.
- Nomi che iniziano con api: rappresentano le API esistenti in tutte le edizioni di Windows che soddisfano i requisiti di versione dell'API.
- I nomi che iniziano con ext-rappresentano le API che potrebbero non esistere in tutte le edizioni di Windows.
- Il nome deve terminare con la sequenza l n-n-n>><>,< dove n è costituito da cifre decimali.<
- Il corpo del nome può essere costituito da caratteri alfanumerici o trattini (-).
- Per il nome non viene fatta distinzione tra maiuscole e minuscole.
Ecco alcuni esempi di nomi di contratto del set di 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
È possibile usare un nome del set di API nel contesto di un'operazione del caricatore, ad esempio LoadLibrary o P/Invoke anziché un nome di modulo DLL per garantire una route corretta all'implementazione indipendentemente dalla posizione in cui l'API viene effettivamente implementata nel dispositivo corrente. Tuttavia, quando si esegue questa operazione, è necessario aggiungere la stringa .dll alla fine del nome del contratto. Si tratta di un requisito del caricatore per il corretto funzionamento e non viene considerato effettivamente una parte del nome del contratto. Anche se i nomi dei contratti appaiono simili ai nomi delle DLL in questo contesto, sono fondamentalmente diversi dai nomi dei moduli DLL e non fanno riferimento direttamente a un file su disco.
Ad eccezione dell'aggiunta della stringa .dll nelle operazioni del caricatore, i nomi dei contratti del set di API devono essere considerati un identificatore non modificabile che corrisponde a una versione del contratto specifica.
Identificazione dei set di API per le API Win32
Per identificare se una particolare API Win32 appartiene a un set di API, esaminare la tabella dei requisiti nella documentazione di riferimento per l'API. Se l'API appartiene a un set di API, la tabella dei requisiti nell'articolo elenca il nome del set di API e la versione di Windows in cui l'API è stata introdotta per la prima volta nel set di API. Per esempi di API che appartengono a un set di API, vedere gli articoli seguenti: