Aracılığıyla paylaş


Bellek Ayırma

Uygulamaların bu veriler için bellek ayırması gerekir; TAPI ve hizmet sağlayıcısı verileri sağlar. İşlem zaman uyumsuzsa, zaman uyumsuz yanıt iletisi başarılı olduğunu gösterene kadar veriler kullanılamaz.

Uygulama ile TAPI arasında veri geçirmek için kullanılan tüm veri yapıları düzleştirilmiş. Başka bir ifadeyle, veri yapıları değişken boyutlu veri bileşenleri içeren alt yapılara yönelik işaretçiler içermez. Bunun yerine, değişken miktarda veriyi uygulamaya geri geçirmek için kullanılan veri yapılarının aşağıdaki meta yapısına sahip olması gerekir:

  DWORD  dwTotalSize;
  DWORD  dwNeededSize;
  DWORD  dwUsedSize; 
    <fixed size fields> 
  DWORD  dw<VarSizeField1>Size;
  DWORD  dw<VarSizeField1>Offset; 
    <fixed size fields> 
  DWORD  dw<VarSizeField2>Size;
  DWORD  dw<VarSizeField2>Offset; 
    <common extensions> 
    <var sized field1> 
    <var sized field2>

dwTotalSize üyesi, bu veri yapısına ayrılan bayt cinsinden boyutudur. Veri yapısının sonunu işaretler ve bu veri yapısını kullanan işlevi çağırmadan önce uygulama tarafından ayarlanır. İşlev bu boyutun ötesinde okumaz veya yazmaz. Bir uygulamanın, TAPI'nin yapının içeriğini döndürmesi için ayrılan toplam bayt sayısını belirtmek üzere dwTotalSize üyesini ayarlaması gerekir.

TAPI, dwNeededSize üyesini doldurur. İstenen tüm verileri döndürmek için kaç bayt gerektiğini gösterir. Değişken boyutlu alanların varlığı genellikle uygulamanın ayırmak için gereken veri yapısı boyutunu tahmin etmelerini imkansız hale getirir. Bu alan, veriler için gerçekten gerekli olan bayt sayısını döndürür. Bu sayı dwTotalSizedeğerinden küçük, buna eşit veya daha büyük olabilir ve dwTotalSize üyesinin kendisi için alan içerir. Daha büyükse, döndürülen yapı yalnızca kısmen doldurulur. Uygulamanın gerektirdiği alanlar kısmi yapıda kullanılabiliyorsa, başka hiçbir şey yapılmamalıdır. Aksi takdirde, uygulamanın en az dwNeededSize boyutuna sahip bir yapı ayırması ve işlevi yeniden çağırması gerekir. Genellikle, bu kez tüm bilgileri döndürmek için yeterli alan vardır, ancak boyut yeniden artmış olabilir.

TAPI, yararlı veriler içeren veri yapısının gerçek boyutunu bayt cinsinden belirtmek üzere uygulamaya veri döndürürse dwUsedSize üyesini doldurur. Örneğin, ayrılan bir yapı çok küçükse ve kesilen alan değişken boyutlu bir alansa, dwNeedSizedwTotalSize'den büyükse ve kesilmiş alan boş bırakılır. Bu nedenle dwUsedSize üyesi dwTotalSizedeğerinden daha küçük olabilir. Kısmi alan değerleri döndürülmüyor.

Bu üst bilgi, veri yapısının sabit bölümüdür. Gerçek değişken boyutlu alanları açıklayan normal alanlar ve boyut/uzaklık çiftleri içerir. Uzaklık alanı, kaydın başından itibaren değişken boyuttaki alanın bayt cinsinden uzaklığını içerir. Boyut alanı, değişken boyuttaki alanın bayt cinsinden boyutunu içerir. Değişken boyutta bir alan boşsa, boyut alanı sıfırdır ve uzaklık sıfır olarak ayarlanır. Toplam yapı boyutu yetersizse kesilecek değişken boyuttaki alanlar boş bırakılır. Başka bir ifadeyle, boyut alanı sıfır olarak ayarlanır ve uzaklık sıfır olarak ayarlanır. Değişken boyuttaki alanlar sabit alanları izler.

Hizmet sağlayıcısının değişken bir üyeyi doldurması gerekiyorsa, TAPI ilgili boyutu başlatır ve üyeleri sıfıra kaydırabilir. Hizmet sağlayıcısı değişken üyesini doldurursa, değişken üyelerini ayarlarsa dwUsedSize ve dwNeedSize dahil olmak üzere ilgili boyut ve uzaklık üyelerini uygun değerlere ayarlaması gerekir. Hizmet sağlayıcısının kullanılabilir alana sığması için değişken üyesini kesmemesi gerekir.

Hizmet sağlayıcısı, yapının sabit üyelerinden hemen sonra değişken üyeleri başlatmalı ve TAPI'nin değişken uzunluklu üyeler için kullanabilmesi için ayrılan belleğin sonunda herhangi bir ek alan bırakmalıdır. Değişken üyelerini herhangi bir sırada yerleştirebilir, ancak üyelerin bitişik olması gerekir.