Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ö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.
API kümeleri , kitaplık bağlama işlemine bir modül ad alanı yeniden yönlendirmesi eklemek için kitaplık yükleyicisindeki işletim sistemi desteğine dayanır. API kümesi sözleşme adı bir dosyayı adlandırmaz. Yükleyici, bu sözleşme adından uygulamayı içeren konak ikilisine bir çalışma zamanı yeniden yönlendirmesi gerçekleştirir.
Yükleyici çalışma zamanında ayarlanmış bir API kümesine bağımlılıkla karşılaştığında, bu API kümesinin konak ikili dosyasını tanımlamak için görüntüdeki yapılandırma verilerine başvurur. Bu yapılandırma verileri, API kümesi şemasıolarak adlandırılır. Şema, işletim sisteminin bir özelliği olarak bir araya getirilir ve API kümeleri ile ikili dosyalar arasındaki eşleme, belirli bir cihaza hangi ikili dosyaların dahil olduğuna bağlı olarak farklılık gösterebilir. Şema, tek bir ikili dosyadaki içeri aktarılan bir işlevin, uygulamayı barındıran modül yeniden adlandırıldığında, bölündüğünde veya yeniden düzenlendiğinde bile farklı cihazlarda doğru şekilde yönlendirilmesine olanak tanır.
İçeri aktarmalar bir uygulamaya nasıl ulaşır?
İkili bir API kümesi uygulamasına, içeri aktarma tablosundaki adla karar vererek iki şekilde ulaşabilir:
- Doğrudan API kümesi içeri aktarma. İkili bir API kümesi sözleşme adını içeri aktarır. Yükleyici, API kümesi şeması aracılığıyla bu adı geçerli cihazdaki konak ikili dosyası olarak çözümler.
- Eski modül içeri aktarma. İkili,samplefeature.dllgibi eski bir Windows modül adını içeri aktarır. Bu modülü içeren bir sürümde yükleyici doğrudan bu modüle bağlanır. Onun yerini alan bir sürümde, aynı adı taşıyan bir ters iletici içeri aktarmayı bir API kümesine yönlendirir ve yükleyici daha sonra şema aracılığıyla çözümlenir.
İçeri aktarma tablonuzda bu adlardan hangisi çoğunlukla yazdığınız kaynak yerine bağlandığınız kitaplık tarafından belirlenir. Bkz. Windows şemsiye kitaplıkları.
geçerli Windows sürümlerini hedefleyen kod için API kümesi sözleşme adını tercih edin. Yükleyici, arada iletici olmadan doğrudan konağa çözümler. API kümesi mevcut olmadan önce yayımlanan Windows sürümlerde de çalışan tek bir ikili dosyaya ihtiyacınız olduğunda eski modül adını içeri aktarın. Ters iletme, ikilinin eski modülün değiştirildiği sürümlerde çalışmasını sağlar.
Doğrudan API kümesi içeri aktarma
Çözünürlük üç adımlı bir dizidir:
- İkili dosyanız bir API kümesi sözleşme adını içeri aktarır veya LoadLibrary'ye geçirir.
- Yükleyici, sözleşmeyi geçerli cihazdaki API kümesi şemasında arar ve şemanın eşlediği konak ikili dosyasını bulur.
- Yükleyici bu konak ikili dosyasını yükler ve içeri aktarılan işlevi konağın dışarı aktarma işlemine bağlar.
Eşleme dosya sistemi yerine şemada yer aldığı için, aynı içeri aktarma işlemi farklı cihazlardaki farklı ikili dosyalara çözümlenebilir:
| Cihaz |
api-win-core-samplefeature eşleme |
|---|---|
| Özelliği içeren bir cihaz | samplefeature.dll |
| Yeniden düzenlenmiş bir uygulama ile birlikte gelen bir cihaz | samplefeaturecore.dll |
| Özelliği içermeyen bir cihaz | Eşlenmemiş |
samplefeature Burada kullanılan adlar, kurgusal Windows bileşeni için açıklayıcı adlardır.
Tüketen ikili, hangi konağa bağlandığının farkında değildir. Mekanizmanın amacı da bu: sözleşme kararlıdır, bunu uygulayan modül ise bir cihazdan diğerine geçmekte serbesttir.
Bir sözleşme adının içeri aktarılması tek bir işlemde çözümlenir ve ara iletici modülü dahil değildir. En verimli biçimdir ve API kümelerine göre yazılmış kod için normal yoldur.
API kümesi adları ve .dll soneki
Eşlemeler disk yerine şemada tutulduğundan, .dll ile biten bir API kümesi adı bu addaki bir dosyaya başvurmaz. .dll bölümü yalnızca modül adlarının içeri aktarma tablosunda yazılma biçiminden taşınan bir adlandırma kuralıdır. API kümesi adı, fiziksel DLL dosyası için diğer ad veya sanal ad gibidir.
Bir yükleyici işlemi veya ext-ile api- başlayan bir ad aldığında, yükleyici bunu şema aracılığıyla sözleşmeleri çözümleyen yükleyicinin bir uzantısı olan API kümesi çalışma zamanına yönlendirir. API kümesi çalışma zamanı, adı dosya adı olarak değil API kümesi adlandırma kurallarına göre ayrıştırır, bu nedenle .dll soneki çözümlenen sözleşme adının bir parçası değildir. Bir addan çalışırken, içeri aktarma tablosunda göründüğü şekilde son eki ekleyin; aksi takdirde bunu devre dışı bırakabilirsiniz.
Yükleyici, aynı şema aracılığıyla hem sözleşme adı biçimlerini, hem sürümlenmiş bir sözleşme adını hem de bir sözleşme diğer adını çözümler. Bu adları yöneten kurallar için bkz. API sözleşme adlarını ayarlama.
Ad kararlılığı kullanılabilirlik ile aynı değildir
API kümesi adı, Windows cihazlarda kararlıdır; aynı ad her zaman tanındıysa aynı sözleşmeyi tanımlar. Bu ad alanının bir özelliğidir, belirli bir cihazla ilgili garanti değildir.
Belirli bir sözleşme bir cihazda bulunmayabilir veya mevcut olabilir ancak bir konakla eşlenemez. Adla ilgili hiçbir şey size hangisinin olduğunu söylemiyor. Uygulamanın gerçekten orada olup olmadığını öğrenmek için bkz. API kümesi kullanılabilirliğini algılama.
Hangi çözünürlük gerekir?
Uygulamaya ulaşmak için api kümesi aracılığıyla yapılan bir çağrı için aşağıdakilerin tümünün tutulması gerekir:
- Sözleşme, geçerli cihazdaki şemada bulunur.
- Şema, sözleşmeyi bir konak ikili dosyasıyla eşler ve bu konak yüklenebilir.
- Konak, ikili dosyanızın çağıran belirli işlevini dışarı aktarır.
Bunlardan biri tutmadığında, hatanın ortaya çıktığı yer API kümesini nasıl içeri aktardığınıza bağlıdır:
| İçeri aktarma stili | Sözleşmenin çözümlenememe davranışı |
|---|---|
| Statik içeri aktarma | İşlem başlatılamıyor. Yükleyici, kodunuzdan herhangi biri çalışmadan önce statik içeri aktarmaları çözümler. |
| Gecikmeli içeri aktarma | İşlem normal şekilde başlar. Çözüm, kodunuzun hatayı işleyebildiği API'ye yapılan ilk çağrıya ertelenir. |
Eksik bir dışarı aktarma, eksik bir sözleşmeden ayrı olarak bildirilir; Konağın dışarı aktarmadığı bir işlevi içeri aktaran ikili dosya eksik bir giriş noktası hatasıyla başarısız oluyor.
Başarılı bir yükün size söylemediği şey
Çözüm, bir sözleşmeyi bir konağa bağlar. Bu sözleşmedeki tek bir özelliğin durumunu değerlendirmez.
Bir sözleşme, tek tek kullanılabilir özelliklerini adlandırılmış gruplar halinde düzenleyebilir. Yükleyici sözleşme ayrıntı düzeyinde bağlandığından ve bağlandığında grup durumuna danışmadığından, bir grup, taşıyan sözleşme normal şekilde çözümlense bile cihazda kullanılamaz. Bu kasıtlı bir işlemdir: Konağı bağlamayı reddetmek statik içeri aktarma için önemli olduğundan yükleyici izin veren yolu alır ve daha ince soruyu çağırana bırakır.
Kodunuzun sonucu, başarılı bir yük veya başarılı bir LoadLibrary çağrısının belirli bir özelliğin kullanılabilir olduğuna dair bir kanıt olmadığıdır. Bu soruyu bir kullanılabilirlik sorgusuyla açıkça sorun. Bkz. API kümesi kullanılabilirliğini algılama.
İsteğe bağlı API kümeleri ve yükleme gecikmesi
Uygulamanız mevcut olmayabilecek bir API kümesini çağırırsa, kendi başına kullanılabilirlik denetimi yeterli değildir: statik içeri aktarma işlemi başlatılamaz, bu nedenle yürütme hiçbir zaman denetime ulaşmaz.
İsteğe bağlı kod yolunu erişilebilir durumda tutmak için, isteğe bağlı API'yi gecikmeli yükleme için taşıyan modülü yapılandırın veya kullanılabilirlik sorgusu başarılı olduktan sonra LoadLibrary ve GetProcAddress ile hedefi dinamik olarak çözün. Her iki yaklaşımın ayrıntıları için bkz. API kümesi kullanılabilirliğini algılama.
Ters iletme
API kümesi adları, cihazlar arasında modüller için kararlı bir ad alanı sağlarken, her ikiliyi bu sisteme dönüştürmek her zaman pratik değildir. Bir uygulama uzun yıllardır ortak kullanımda olabilir ve ikili dosyalarını yeniden derlemek mümkün olmayabilir. Bazı uygulamaların belirli API kümeleri kullanılmadan önce oluşturulmuş sistemlerde de çalışmaya devam etmesi gerekir.
Buna uyum sağlamak için, özgün modülleri taşımayen sürümler bir dizi ters iletici içerir: başlangıçta Windows bilgisayarlarda tanıtılan modül adlarını taşıyan ve dışarı aktarmalarını API kümelerine yönlendiren uyumluluk ikilileri.
Tam masaüstü sürümü özgün modülleri getirir, bu nedenle eski modül adının içeri aktarılması modüle her zaman olduğu gibi bağlanır. Bu modülün yerini alan bir sürümde, aynı adı taşıyan ters iletici boşluğu kaplar.
Yükleyici işlemi şöyle davranır:
- Yükleyiciye, cihazda bulunmayan eski bir Windows bilgisayar modülü adına bağımlılık sunulur.
- Yükleyici, bu modül adını taşıyan bir ters iletici bulur ve yükler.
- Ters iletici, içeri aktarılan işlevi bir API kümesine yeniden yönlendirir.
- Yükleyici, bu konu başlığında daha önce açıklandığı gibi şema aracılığıyla ayarlanan API'yi çözümler.
Kavramsal olarak eşleme şöyle görünür:
İçeri aktarılan DLL: samplefeature.dll
- Özgün modülü içeren bir sürümde: samplefeature.dll
- Yerini alan bir sürümde: samplefeature.dll ters iletici ->
api-win-core-samplefeature->samplefeaturecore.dll
Bu yoldaki sınır dışarı aktarma kapsamıdır. Ters iletici yalnızca API kümesi eşdeğerlerine sahip dışarı aktarmaları taşır, bu nedenle özgün modülün yaptığı her işlevi dışarı aktarması gerekmez. Ters ileticinin taşımadığı bir işlevi içeri aktaran ikili dosya eksik bir giriş noktası hatasıyla yüklenemiyor.
Ters iletme, başarılı bir çözümü bir uygulamanın mevcut olduğunun kanıtı olarak değerlendirmeme nedenidir. Eski modül adına karşı GetProcAddress çağrısı, hata döndüren saplamaya çözümlenen geçerli bir işlev işaretçisi döndürebilir. Bunun yerine açıkça sorgu kullanılabilirliği. Bkz. API kümesi kullanılabilirliğini algılama.
Not
Ters iletme, Win32 API yüzeyinin yalnızca bir alt kümesini kapsar. Windows masaüstü sürümlerini hedefleyen uygulamaların tüm Windows cihazlarda çalışmasına izin vermez. İkili dosyanız geçerli Windows sürümlerini hedeflediyse, API kümesi sözleşme adı daha doğrudan seçimdir.