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'sinden ve API'nin ait olduğu işlevsel sözleşmeden mimari 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 desteklense de, HoloLens, Xbox ve diğer cihazlar gibi diğer Windows cihazlarında Win32 API'sinin yalnızca bir alt kümesi kullanılabilir. API kümesi adı, belirli bir cihazda bir API'nin kullanılabilir olup olmadığını temiz bir şekilde algılamak için bir sorgu mekanizması sağlar.

  • 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ı, fiziksel bir .dll dosyası için sanal diğer ad. 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ümlerinde ve sürümlerinde yeniden düzenlenmesine (bölünmüş, birleştirilmiş, yeniden adlandırılmış vb.) olanak tanır. Uygulamalarınız hala bağlantı oluşturur ve çalışma zamanında 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 başvurularını çözümleyen bölümüdür. Ön uçta yükleyici, LoadLibrary geçirilen tüm dizelerin ".dll" ile sonlandırılabilmesini gerektirir. Ancak bu ön uç sonrasında yükleyici bu soneki ayırabilir ve sonuçta elde edilen dizeyle API kümesi veritabanını sorgulayabilir.

LoadLibrary (ve gecikme yükü) api kümesi adıyla (içinde ".dll" ile) başarılı olur; ancak bilgisayarın herhangi bir yerinde bu ada sahip gerçek bir dosya olması şart değildir.

Şemsiye kitaplıklarını 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. Örneğin, OneCore.lib adlı bir şemsiye kitaplığı, tüm Windows cihazları için ortak olan Win32 API'lerinin alt kümesi için dışarı aktarmalar sağlar.

Daha fazla ayrıntı 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 bu standart kuralları izleyen güçlü bir sözleşme adıyla tanımlanır.

  • Adın api- veya ext- dizesiyle başlaması gerekir.
    • API ile başlayan adlar- API'nin sürüm gereksinimlerini karşılayan tüm Windows sürümlerinde bulunan API'leri temsil eder.
    • ext- ile başlayan adlar, tüm Windows sürümlerinde mevcut olmayan API'leri temsil eder.
  • Ad l l<n>-<n>-<n>ile bitmelidir; burada n ondalık basamaklardan oluşur.
  • Adın gövdesi alfasayısal karakterler veya tireler (-) olabilir.
  • Ad büyük/küçük harfe duyarsız.

API kümesi sözleşme adlarından bazı örnekler aşağıda verilmiştir:

  • 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

API kümesi adını, API'nin geçerli cihazda gerçekte nereye uygulandığına bakılmaksızın uygulamaya doğru bir yol sağlamak için DLL modülü adı yerine LoadLibrary veya P/Invoke gibi bir yükleyici işlemi bağlamında kullanabilirsiniz. Ancak, bunu yaptığınızda, sözleşme adının sonuna .dll dizesini eklemeniz gerekir. Bu, yükleyicinin düzgün çalışması için bir gereksinimdir ve aslında sözleşme adının bir parçası olarak kabul edilmez. Sözleşme adları bu bağlamda DLL adlarına benzer görünse de, dll modülü adlarından temelde farklıdır ve doğrudan diskteki bir dosyaya başvurmaz.

Yükleyici işlemlerinde .dll dizesini eklemek dışında, API kümesi sözleşme adları belirli bir sözleşme sürümüne karşılık gelen sabit bir tanımlayıcı olarak kabul edilmelidir.

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:

  • allowSetForegroundWindow
  • FindWindowsEx
  • GetClassFile

Bu bölümde