Makale numarası: 125713 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 3.1

Ortak dosya sorunları ve Platform değişiklikleri eşleme

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Bu makalede, bazı dosya eşleme kullanırken sık karşılaşılan sorunlar giderir. Çıkış dosyası eşleme uygulaması platformu bazı farklılıklar da gösterir.

Bu makalede, dosya eşlemesi gerçekleştirmek için bu yordamlar açıklanmaz. Dosya eşleme kullanma hakkında daha fazla bilgi için lütfen Microsoft Win32 Programcı Başvurusu dosya eşleme özete bakın. Ayrıca bkz: "CreateFileMapping() OpenFileMapping(), MapViewOfFile(), MapViewOfFileEx(), UnmapViewOfFile() ve FlushViewOfFile() açıklamalarını..

Daha fazla bilgi

Ad boşluğu çakışması

Aynı ada sahip iki farklı nesne türlerini mümkün değildir; bu nedenle olay semafor, mutex ve dosya eşleme nesnelerin adlarını aynı ad boşluğunu paylaşır. Dosyayı oluşturmak veya başka türde bir nesne tarafından zaten kullanılmakta olan bir adı kullanarak bir türü olan bir nesneyi açma girişiminde bir hatadır.

Bunlar, başka türde bir nesne tarafından kullanılmakta olan bir nesne adı belirtirseniz, CreateFileMapping() ve OpenFileMapping() başarısız olur. Her iki durumda da, GetLastError() ERROR_INVALID_HANDLE (6) döndürecektir.

Nesne türleri arasındaki çakışmaları önlemek için <a0></a0>, bir nesne türü adı eklemek için çözümüdür. Örneğin, "EV_myapp_block_ready" nesne adı eşleştirmek için bir dosya için bir olay ve nesne adı ve "FM_myapp_missile_data" kullanın.

Eşleşen bir dosya, tüm görünümler Unmapping, necessity

Windows, bu nesnenin, her görünüm için dosya eşleme nesnesi için dahili bir tanıtıcı MapViewOfFile() veya MapViewOfFileEx() tarafından oluşturulmuş olup olmadığını korur. Bu bir iç tanıtıcı, ayrıca CreateFileMapping() tarafından döndürülen bir tanıtıcıya tutulur. Tanıtıcı ile ilişkilendirilmiş görünümü tarafından arama UnmapViewOfFile() unmapped kadar iç tanıtıcı kapalı. Tam bir dosyayı kapatmak için iç tanıtıcıları dahil nesne için tüm tanıtıcıları kapatılması eşleştirme nesnesi gerektirir. Bu nedenle, bir <a0>Dosya</a0> eşleme nesnesini kapatmak için <a0></a0>, bu nesnenin tüm görünümlerde bağlanılmayan olmalıdır ve CreateFileMapping() tarafından döndürülen tanıtıcı kapatıldı.

Dosya eşleme nesnesinin extant bağlanılmayan görünümler bir CloseHandle() başarısız nesne tanıtıcısı neden olacak DEĞIL. Kendi nesne tanıtıcısı başarıyla kapatıldı, bu nedenle, dosya eşleme nesnesi değil mutlaka boşaltıldıktan başka bir deyişle, gerekmeyen tüm görünümlerde, bağlanılmayan olan doğru değildir.

Başarısızlık düzgün nesnesinin tüm görünümlerde unmap ve nesne tanıtıcısı'ı kapatmak için sızıntıları uygulamanın disk belleği olan havuz, diske alınamayan havuz, sanal bayt sayısını ve ayrıca sistem geniş kaydedilmiş bayt neden olur.

Eşleme nesnelerin boyutu sınırlamaları

Sistem disk belleği dosyası tarafından yedeklenen dosya eşleme nesnesinin boyutunu kullanılabilir sistem sanal bellek, VirtualAlloc()) çağrısı kaydedilmiş, bellek miktarını (anlamına gelir. sınırlıdır

Windows NT'DE bir adlandırılmış bir disk dosyası tarafından yedeklenen dosya eşleme nesnesinin boyutunu, kullanılabilir disk alanıyla sınırlandırılır. Eşlenmiş bir görünüm nesnenin boyutu, en büyük bitişik ayrılmamış sanal bellek (en fazla 2 GB zaten işlem tarafından ayrılan sanal bellek eksi) eşleme işlemi işlemindeki öbeğini sınırlıdır.

Win32 sistemlerde, bir adlandırılmış bir disk dosyası tarafından yedeklenen dosya eşleme nesnesinin boyutunu kullanılabilir sistem sanal belleği, sanal bellek yönetimi uygulaması Win32 yüzünden sınırlıdır. Win32s, eşlenmiş bölüm büyük dosyalar eşleştirmek için kullanmak için çok küçük halde takas alanı gerekli değildir ve Windows tarafından VM ayarlamak, bellek normal sanal bellek ayırır. Ile Windows NT gibi kullanılabilir disk alanını da bir sınırlama getirdiğine.

Windows 95'te, kullanılabilir disk alanı bir adlandırılmış bir disk dosyasına yedeklenen dosya eşleme nesnesinin boyutunu sınırlıdır. Eşlenmiş bir görünüm nesnenin boyutu, en büyük bitişik paylaşılan olan sanal sahası ayrılmamış sanal bellek bloğu sınırlıdır. Bu, Windows 95'in (16-bit Windows tabanlı uygulamalar gibi) bir paylaşılan sanal sahası kullanan diğer bileşenler tarafından kullanılan herhangi bir bellek eksi 1 GB, en fazla olacaktır. Örtüşmeyen tüm eşlenen görünümler sistemde çalışan tüm uygulamalar için toplam boyutu bu sınırı uygulanır, böylece her eşlenmiş görünüm bu sahası bellek kullanır.

Eşlenen dosya May Not otomatik olarak artmış olabilir.

Boyut için bir dosya eşleme nesnesi yedeklediyseniz adlandırılmış bir disketi tarafından bir ça?r? CreateFileMapping() dosyasında eşleme yedeklemek için kullanılan dosya boyutundan büyük, dosya genellikle CreateFileMapping() çağrı tarafından belirtilen boyuta büyütülmesi olacaktır.

PAGE_WRITECOPY fdwProtect parametresi belirtilirse, yalnızca Windows NT üzerinde dosya otomatik olarak artmış değil. Bu CreateFileMapping() başarısız olmasına neden olur ve GetLastError() ERROR_NOT_ENOUGH_MEMORY (8) döndürecektir. CreateFileMapping() çağırmadan önce dosyanın boyutunu ayarlamak için <a0></a0>, SetFilePointer() ve SetEndOfFile() kullanın.

MapViewOfFileEx() ve lpvBase geçerli aralığı

Windows NT'DE, 0-2 adres aralığındaki dosya eşleşme nesnelerini görünümlerini eşleştirilir GB. Bir adresi bu aralık dışında geçirmeden lpvBase MapViewOfFileEx() parametresi başarısız olmasına neden olur ve GetLastError() ERROR_INVALID_PARAMETER (87) döndürecektir.

Windows 95'te, dosya eşleşme nesnelerini görünümlerini (paylaşılan sanal sahası) 2-3 GB adres aralığındaki eşleştirilir. Bir adresi bu aralık dışında geçirmeden MapViewOfFileEx() başarısız olmasına neden olur ve GetLastError() ERROR_INVALID_ADDRESS (487) döndürecektir. Gelecekteki güncelleştirmelerin Windows 95 için eşleme aralığı 0-2'ye değişebilir Not GB, Windows NT gibi.

MapViewOfFileEx() ve lpvBase tahsisat durumu

Bir adres MapViewOfFileEx() lpvBase parametresi için belirtilen ve ayrılmamış sanal adres alanı bayt cbMap parametresinde belirtilen karşılamak için yeterince büyük bu adresteki öbeğini değil, MapViewOfFileEx() başarısız olur ve GetLastError() ERROR_NOT_ENOUGH_MEMORY (8) döndürecektir. Bu, sistem belleğinin yetersiz olduğunu veya işlemin daha fazla bellek ayrılamıyor gelmez. Bu, yalnızca istenen sanal adres aralığı zaten bu işlemde rezerve edilmiş anlamına gelir.

Arama MapViewOfFileEx() önce VirtualQuery() ayrılmamış sanal adres alanı için uygun bir aralığı belirlemek için kullanılır.

MapViewOfFileEx() ve lpvBase, parçalı yapı

Belirtilen bir ça?r? MapViewOfFileEx() lpvBase parametresi için bir katı sistemin tahsisat parçalı yapı kullanmanız gerekir. Windows NT'DE bir değer belirterek MapViewOfFileEx() başarısızlık ve GetLastError() ERROR_MAPPED_ALIGNMENT dönmek için neden olur (1132). Windows 95'te, adres sistemin tahsisat parçalı yapı tam sayı en yakın katına yuvarlanır.

Sistemin tahsisat parçalı yapı belirlemek için <a0></a0>, GetSystemInfo() arayın.

Eşleşen görünümler adresleri

Bir dosyayı (veya paylaşılan bellek) genel bir görünümünü eşlenirken, ya da işletim sistemi görünümü adresini belirlemek, veya MapViewOfFileEx() işlevi lpvBase parametresi olarak bir adresi belirtmek üzere olanaklıdır. Birden çok işlem arasında paylaşılan dosya eşleştirmesini gittiği, MapViewOfFile() kullanın ve adres eşleştirmesi için seçtiğiniz işletim sistemi için önerilen yöntem olur. Bunu yapmak için iyi bir nedeni vardır:
  • Windows NT'DE, görünümler, bağımsız olarak her işlemin adres alanına eşleştirilir. Belirtilen sanal adres aralığı görünümü her işlemde aynı Adres eşleme kullanışlı olabilir, ancak tüm süreçlerle ilgili boş olamaz. Bu nedenle, eşleme, bir (veya daha fazla) dosya eşlemesi paylaşmak istediğiniz işlemleri başarısız olabilir.
  • Windows 95'te, dosya eşlemesi, 2'de mevcut - 3 GB adres aralığı (paylaşılan sanal sahası) nesneleri. Bu nedenle, görünüm için bir başlangıç adresi olarak belirlenen bir kez ek görünümler eşleme, her işlemdeki aynı adresi yine de eşleştirilir ve hiçbir yararı, belirli bir adres için bir başlangıç eşleme zorlamak çalışıyor. Belirtilen adres, ikinci ve sonraki görünümleri eşleştirme nesnesi için asıl adresi burada Windows 95 görünümün eşleştirilmiş sonra MapViewOfFileEx() başarısız olur ve GetLastError() ERROR_INVALID_ADDRESS (487) döndürür lpvBase eşleşmiyor. Ayrıca, pre-determined adresindeki ilk görünüm eşleştirme girişimi sırasında bu adres zaten paylaştırılmış olan sanal sahası kullanan Windows 95'in diğer bileşenler tarafından kullanılıyor olabilir. Gelecekteki güncelleştirmelerin Windows 95 için eşleme aralığı 0-2'ye değişebilir Not GB, Windows NT gibi.
Windows NT altında birden çok işlem içinde aynı adres eşlemeleri oluşturmak kesinlikle gerekli ise, iki olası yaklaşımdan şunlardır:
  1. Uygun bir adresi seçin ve sanal adres alanı yönetmek, böylece bu adres kullanılabilir olarak kalır. Bu, kendi DLL dosyaları alma, belirli konumlarda bellek ayrılırken ve sanal adres alanı desen gözlemek için işlem Walker gibi bir aracı kullanarak anlamına gelir. Olabildiğince kısa sürede yürütülmesine uygulamasının, istediğiniz adres alanı ayırmak veya eşleme gerçekleştirmek. Yürütülebilir dosyanın kendisini yeniden başlatılmadan önce denir, çünkü bunu yapmak için bir uygun bir DLL DOSYASı, <a1>PROCESS_ATTACH</a1> işlemedeki yerdir. Not: Söz konusu hala bazı DLL zaten adresteki yüklenmedi garanti yoktur. Değilse ilgili olan tüm işlemler önceden belirlenmiş adresinde eşleyebilir, bunlar başarısız veya yeni bir adresi deneyin.

    -VEYA-
  2. Tüm süreçlerle ilgili uygun bir adresi anlaşması vardır. Işlemler tüm VirtualQuery() işlevi bir genel adres yeterince büyük olan her bir işlemde bulunana kadar adres alanlarını taramak için kullanabileceğiniz ayrılmamış bir blok. Bu, ilgili tüm işlemleri aynı anda adres eşleme gerektirir. Adresi belirlendikten sonra başlayan BIR işlem bu adreste eşleme ve bunu yapamazsınız başarısız gerekir. Alternatif olarak, anlaşma işlemi, yeniden her işlemi sırasında yeni adres eşleme ile yinelenmesi. Tüm işaretçiler eşleme içine daha sonra yeniden gerekir.
Ikinci yöntemi, başarılı olmak daha olasıdır. Ayrıca birleştirilebilir ile ilk daha olası uygun bir adresi hızlı bir şekilde bulunan yapmak.

Görünümler, Windows NT altında farklı adreslere eşlenen, ortaya çıkan zorluk eşleme kendi içinde eşleme işaretçiler depolama olur. Başka bir işlem eşlemesindeki içinde aynı konuma bir işaretçi bir işlemdeki göstermiyor olmasıdır. Bu sorunu çözmek için <a0></a0>, işaretçileri yerine uzaklıklar oturumunda depolamak ve gerçek adresleri her işlemdeki kaydırma için temel adresi eşleme ekleyerek hesaplar. Bunun için kullanılan temel işaretçiler bırakılabilen öğelerdir ve böylece temel gerçekleştirmek + dönüştürme örtülü olarak mahsup. Kısa BIR SDK örnek BPOINTER adı verilen bu teknik gösterilmiştir.

Ek bir platform farklar

Gerçekleştirirken, ek sınırlamalar eşleme, Windows 95 altında dosya:
  1. MapViewOfFile() ve MapViewOfFileEx() dwOffsetHigh parametreleri kullanılmaz ve sıfır olmalıdır. Windows 95 32-bit dosya sistemi kullanır.
  2. CreateFileMapping() dwMaximumSizeHigh parametresini kullanılmaz ve sıfır olmalıdır. 32-Bit dosya sistemine yeniden budur.
  3. SEC_IMAGE ve SEC_NOCACHE bayrakların CreateFileMapping() fdwProtect parametresi için desteklenmez.
  4. FILE_MAP_COPY bayrak bir <a0>Dosya</a0> eşleme nesnesinin genel bir görünümünü eşlemek için kullanılıyorsa, nesnenin PAGE_WRITECOPY kullanılarak oluşturulmuş olması gerekir koruma. Ayrıca, nesnenin adlandırılmış bir dosya sistem disk belleği dosyası yerine yedeklenen gerekir (diğer bir deyişle, geçerli bir dosya tanıtıcı, değil (TANıTıCı), 0xFFFFFFFF CreateFileMapping()) hFile parametresi belirtilmelidir. Bunlardan birini başarısızlığı MapViewOfFile() başarısızlık ve GetLastError() ERROR_INVALID_PARAMETER (87) geri dönmek için neden olur.
  5. (Örneğin, adlandırılmış bir nesne kullanarak), iki veya daha fazla işlem PAGE_WRITECOPY görünümü, aynı dosya eşleme nesnesi eşleme, görünüme göre başka bir zorlanacak yapılan değişiklikleri görmek için kullanılırlar. Gerçek bir disk dosyası, ancak değiştirilmez. Windows NT altında bir işlem için Görünüm, yazar, değiştirilmiş sayfa kendi kopyasını alır ve diğer bir zorlanacak veya disk dosyasının sayfaları etkileyecektir.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Win32 Uygulama Programlama Arabirimi, Ne zaman ne ile kullanilir:
    • Microsoft Windows NT 3.51 Service Pack 5
    • Microsoft Windows 95
    • Microsoft Win32s 1.3
Anahtar Kelimeler: 
kbmt KB125713 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:125713  (http://support.microsoft.com/kb/125713/en-us/ )