Windows API kümeleri

Önemli

Bu konudaki bilgiler Windows 10 ve sonraki sürümleri için geçerlidir. Bu sürümlere burada "Windows" adını vereceğiz ve gerektiğinde tüm özel durumları çağıracağız.

Windows'un tüm sürümleri, çekirdek işletim sistemi olarak adlandırılan ortak bir işletim sistemi (OS) bileşeni tabanını paylaşır (bazı bağlamlarda bu ortak temel, OneCore olarak da adlandırılır). Temel işletim sistemi bileşenlerinde, Win32 API'leri API kümeleri olarak adlandırılan işlevsel gruplar halinde düzenlenir.

API kümesinin amacı, belirli bir Win32 API'sinin uygulandığı konak DLL'si ile API'nin ait olduğu işlevsel anlaşma arasında mimari bir ayrım sağlamaktır. API kümelerinin uygulama ve sözleşmeler arasında sağladığı ayırma, geliştiriciler için birçok mühendislik avantajı sunar. Özellikle, kodunuzda API kümelerini kullanmak Windows cihazlarıyla uyumluluğu geliştirebilir.

API kümeleri özellikle aşağıdaki senaryoları ele almaktadır:

  • Win32 API'sinin tüm genişliği bilgisayarlarda destekleniyor olsa da, win32 API'sinin yalnızca bir alt kümesi HoloLens, XBOX ve diğer cihazlar gibi diğer Windows cihazlarda kullanılabilir. API kümesi adı, uygulamanızın çalışma zamanında geçerli aygıtta bir yeteneğin kullanılabilir olup olmadığını tespit edebilmesi için sorgulayabileceğiniz kararlı bir başvuru noktası sağlar. Sorgunun kendisi IsApiSetImplemented işlevi tarafından gerçekleştirilir.

  • Bazı Win32 API uygulamaları, farklı Windows cihazlarında farklı adlara sahip DLL'lerde bulunur. API kullanılabilirliği algılanırken DLL adları yerine API kümesi adlarının kullanılması ve API'lerin yüklenmesinin gecikmesi, API'nin gerçekte nerede uygulandığı fark etmez, uygulamaya doğru bir yol sağlar.

Daha fazla ayrıntı için bkz. API kümesi yükleyicisi işlemi ve API kümesi kullanılabilirliğini algılama.

API kümeleri ve DLL'ler aynı şey mi?

Hayır, API kümesi adı bir dosyayı değil sözleşmeyi tanımlar. Çalışma zamanında yükleyici, geçerli cihazdaki API kümesi şeması aracılığıyla bu sözleşmeyi çözümler ve başvuruyu uygulamayı barındıran DLL'ye yönlendirir. Bu, çağıran olarak hangi modülün bilgileri barındırdığını tam olarak bilmeniz gerekmeyen bir uygulama gizleme tekniğidir.

Bu teknik, modüllerin farklı Windows sürümleri ve edisyonlarında yeniden yapılandırılmasına (bölünmesi, birleştirilmesi, yeniden adlandırılması vb.) olanak tanır. Ve uygulamalarınız hâlâ bağlı kalır ve çalışma zamanında yine doğru koda yönlendirilir.

Peki API kümelerinin adlarında neden .dll var? Bunun nedeni, DLL yükleyici uygulanma biçimidir. Yükleyici, işletim sisteminin DLL'leri yükleyen ve/veya DLL'lere yönelik başvuruları çözümleyen bölümüdür ve dosya adlarının içeri aktarma tablosunda yazılma şekliyle yazılmış bir modül adıyla nelerin yüklendiğini tanımlar. API kümesi adları aynı kurala uyar ve aynı yere sığar.

Yükleyici, ext- veya api- ile başlayan bir adı tanır ve bunu, sözleşmeleri şema aracılığıyla çözen bir yükleyici uzantısı olan API kümesi çalışma zamanına yönlendirir. Bu noktadan sonra ad, dosya adı yerine API adlandırma kuralları tarafından ayrıştırılır, bu nedenle .dll sonek çözümlenen sözleşme adının bir parçası değildir.

Bir API kümesi adını LoadLibrary'ye geçirebilir veya gecikme yükleme hedefi olarak kullanabilirsiniz. Geçerli cihazdaki şema bu sözleşmeyi kullanılabilir bir konağa eşlediğinde işlem başarılı olur; bilgisayarda herhangi bir yerde bu ada sahip gerçek bir dosyanın bulunması gerekmez. Sözleşme mevcut cihazda eşlenmemişse, doğrudan LoadLibrary çağrısı başarısız olur. Gecikmeli yüklenen bir referans farklı davranır: süreç yine de yüklenir ve yokluğu, API çağrısı yapıldığında daha sonra ortaya çıkar.

Her iki durumda da, başarılı bir bağlantı veya yük tek başına bir uygulamanın mevcut olduğuna dair kanıt değildir. Bunu belirlemek için bkz. API kümesi kullanılabilirliğini algılama.

Şemsiye kütüphaneleri bağlama

Kodunuzu çekirdek işletim sisteminde desteklenen Win32 API'leriyle kısıtlamayı kolaylaştırmak için bir dizişemsiye kitaplığı sağlıyoruz. Şemsiye kitaplığı, çağırdığınız her API için tek tek içeri aktarma kitaplığını tanımlamak yerine tek bir kitaplığı bağlamanıza olanak tanır.

Daha fazla ayrıntı için ve hedeflediğinizle eşleşen şemsiye kitaplığını seçmek için bkz. Windows şemsiye kitaplıkları.

API kümesi sözleşme adları

API kümeleri, kitaplık yükleyicisi tarafından tanınan kuralları izleyen bir sözleşme adıyla tanımlanır.

Tüm sözleşme adları şu adlandırma kurallarına uyar:

  • Ad, api- veya ext- dizesiyle başlar.
  • Adın gövdesi harf, rakam veya tirelerden (-) oluşabilir. Bir tilde (~), yalnızca bir grup adından önce ayırıcı olarak görünür.
  • Ad büyük/küçük harfe duyarsız.

İki sözleşme adı biçimi kullanılıyor ve bunlardan biriyle karşılaşabilirsiniz.

Sürümlü sözleşme adıl<n>-<n<->n> dizisiyle biter; burada n, ondalık rakamlardan oluşur; örneğin ext-ms-win-core-samplefeature-l1-1-0. Sondaki sayılar sözleşmenin belirli bir sürümünü tanımlar ve bu formdaki bir ad, bu sürüm için sabit bir tanımlayıcı olarak kabul edilmelidir.

Bir sözleşme takma adı sürüm içermez—örneğin, api-win-core-samplefeature. Bir sürümünü değil, bizzat sözleşmenin kendisini tanımlar. Bir sözleşme, tek tek kullanılabilir özelliklerini adlandırılmış gruplar halinde düzenlediğinde, grup adı sözleşme diğer adına eklenerek, tilde ile ayrılmış olarak ele alınır: api-win-core-samplefeature~AdvancedOperations.

samplefeature Burada kullanılan adlar, kurgusal Windows bileşeni için açıklayıcı adlardır.

api- ve ext- ön ekleri

Ön ek bir adlandırma kuralıdır. Başlangıçta, uygun olan her sürümde (api-) bulunan sözleşmeleri, eksik olabilecek sözleşmelerden (ext-) ayırt etmek için tasarlanmıştır. Bu ayrım tutarlı bir şekilde uygulanmadı ve sözleşmenin rolü, sözleşme yeniden adlandırılmadan zaman içinde değişebilir.

Yükleyici ön eke hiçbir anlam atamaz; api-veext- adlarını aynı kurallara göre çözümler. Ön ekten kullanılabilirlik çıkarmayın. Bunun yerine sorgulayın; bkz. API kümesi kullanılabilirliğini algılama.

Sözleşme adını kullanma

İki farklı işlem türü bir sözleşme adı alır.

LoadLibrary veya P/Invoke gibi yükleyici işlemleri, sözleşme adını normalde dll modülü adının göründüğü yerde alır. Bu bağlamda sona eklenen .dll alışılmıştır, ancak API kümesi adı çözümlemesi için gerekli değildir ve sözleşme adının bir parçası değildir. API'nin geçerli cihazda gerçekte nerede uygulandığından bağımsız olarak uygulamaya doğru bir yol sağlamak için fiziksel DLL modülü adı yerine sözleşme adı kullanın. Diskte bu sözleşme adına sahip bir dosya olması gerekmez.

Kullanılabilirlik sorgusu örnekleri geleneksel olarak .dll sonekini atlar ve API'nin ele alınmasıyla eşleşen formu kullanır:

API yüzeyi Sorgu formu Example
Adlandırılmış grup <contract>~<group> api-win-core-samplefeature~AdvancedOperations
Varsayılan grup Sözleşme takma adı, ~Default olmadan api-win-core-samplefeature
Sürümlü sözleşme Tam sürüme dönüştürülen sözleşme adı ext-ms-win-core-samplefeature-l1-1-0

Grup adı, sürümlü bir sözleşme adı ile birleştirilemez.

Win32 API'leri için API kümelerini tanımlama

Belirli bir Win32 API'sinin bir API kümesine ait olup olmadığını belirlemek için API'nin başvuru belgelerindeki gereksinimler tablosunu gözden geçirin. API bir API kümesine aitse, makaledeki gereksinimler tablosunda API kümesi adı ve API'nin API kümesine ilk tanıtıldığı Windows sürümü listelenir. BIR API kümesine ait API örnekleri için şu makalelere bakın:

API'nin üst bilgisi bir Is<APIName>Present yardımcı işlev sağlarsa, kullanılabilirliği test ederken bu yardımcıyı tercih edin. API’yi içeren API kümesi veya grup için doğru adı zaten içerir. Daha fazla bilgi için bkz. API kümesi kullanılabilirliğini algılama.

Bu bölümde