Makale numarası: 172396 - Son Gözden Geçirme: 02 Eylül 2005 Cuma - Gözden geçirme: 3.0

Bir işaretçi veya farklı bir DLL veya EXE başvurudaki STL nesneye erişirken erişim ihlali karşılaşabilirsiniz.

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

Belirtiler

Bir işaretçi veya farklı bir DLL veya EXE başvuru, bir DLL veya EXE oluşturulan STL nesne erişirken, erişim ihlali oluşuyor veya veri bozulması veya veri kaybı görünümünü de dahil olmak üzere diğer önemli program hataları karşılaşabilirsiniz.

Neden

Standart C++ kitaplıkları çoğu sınıflarda statik veri üyeleri, doğrudan veya dolaylı olarak kullanın. Bu sınıflar şablon örneği başlatıldığında oluşturulan bu yana (genellikle DLL veya EXE dosyası adı uzantıları ile) yürütülebilir her görüntü için belirli bir sınıf statik veri üyesi kendi kopyasını içerir. Yöntem statik veri üyesi gerektiren sınıfının yürütüldüğünde, statik veri üyesi yöntemi kodunu bulunduğu yürütülebilir görüntüde kullanır. Yürütülebilir görüntüleri statik veri üyeleri eşit değildir, çünkü bu eylem, erişim ihlaline neden olabilir veya veri kaybı veya bozulması gibi görünebilir.

Çözüm

  1. Erişimci yöntemleri STL oluşturan yürütülebilir görüntüden verme nesne. Bu yöntemler STL nesnesinin gerekli işlevselliğini alın. Bu yolla, STL nesne yalnızca doğrudan içinde tek bir yürütülebilir görüntü erişilecek. Örneğin, MyProgram.EXE MyLibrary.DLL içinde bulunan deque <myclass>içinde sonraki öğeyi almak gereken varsayalım. MyLibrary.DLL erişeni yöntemi, Sınıfım * DequeNextItem verme (/ *... * /). Sonra MyProgram.EXE deque içinde sonraki öğeyi almak için bu yöntemi yürütebilir. Daha kapsamlı bir örnek için aşağıdaki kod örneği</a1> konusuna bakın.

    Bu seçenek, bir DLL dosyasından verilen ya da genel, statik veya statik veri üyesi olan bir sınıf STL nesneler için geçerlidir. Bu seçenek, bir DLL dosyasından verilen statik olmayan veri üyeleri bir sınıf veya otomatik veri çalışmayacak.
  2. Şablon sınıf örneği başlatıldığında bir yürütülebilir görüntüden vermek ve diğer yürütülebilir resimler içe aktarın. MyLibrary.DLL vektör < Sınıfım > MyProgram.EXE içinde bir işlev için bir işaretçi geçerse, sonra <a1>sınıf</a1> Sınıfım ve vektör < Sınıfım > MyLibrary.DLL ver. Sonra bu sınıflar MyProgram.EXE alın. Bunu yaptığınızda, statik bir sınıf üyeleri MyLibrary.DLL içinde bulunan bir kopyası gerekir. Verme ve STL alma hakkında daha fazla bilgi için Microsoft Knowledge Base'deki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
    168958  (http://support.microsoft.com/kb/168958/ ) Bir sınıf içinde ve dışında STL bileşenleri verme

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

Davranışı Yeniden Oluşturma Adımları

   //---------------------------------------------------------
   // AVEXE.CPP
   // Compile options needed: /GX
   #pragma warning (disable : 4786)
   #include <map>
   #include <string>
   #include <stdio.h>

   __declspec(dllimport)
   std::map<int,std::string>* GiveMeAMap(int n);

   __declspec(dllimport)
   void ShowMeTheMap(std::map<int,std::string> *amap);

   __declspec(dllexport)
   const char* MapItemX (std::map<int,std::string> *m, int x);

   int main () {

      // Create the map in the DLL
      int x = 6;
      std::map<int,std::string> *p = GiveMeAMap(x);

      // Display the contents of the map from the DLL
      printf("Showing contents from the DLL\n");
      ShowMeTheMap(p);

      // Display the contents of the map from the EXE
      // using the accessor function from the DLL so we
      // aren't directly accessing the map
      printf("Showing contents from the EXE using accessor\n");
      int i = x;
      while (i--) {
         printf("%d = %s\n",i,MapItemX(p,i));
      }

      // Access Violation when accessing the map that
      // was created in the DLL from the EXE
      printf("Showing contents from the EXE directly\n");
      while (x--) {
         printf("%d = %s\n",x,(*p)[x].c_str());
      }

      return 0;
   }

   //---------------------------------------------------------
   // AVDLL.CPP
   // Compile options needed /GX
   #pragma warning (disable : 4786)
   #include <map>
   #include <string>
   #include <stdlib.h>

   // Create the map here in the DLL
   __declspec(dllexport)
   std::map<int,std::string>* GiveMeAMap(int n) {
      std::map<int,std::string> *m = new std::map<int,std::string>;
      while(n--) {
         char b[33];
         itoa(n,b,2);
         (*m)[n] = std::string(b);
      }
      return m;
   }

   // We can access the map without error from the executable
   // image where the map was created
   __declspec(dllexport)
   void ShowMeTheMap(std::map<int,std::string> *p) {
      int x = p->size();
      while (x--) {
         printf("%d = %s\n",x,(*p)[x].c_str());
      }
   }

   // An accessor method to return the associated C string
   // for key x
   __declspec(dllexport)
   const char* MapItemX (std::map<int,std::string> *m, int x) {
      return (*m)[x].c_str();
   }
				

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Anahtar Kelimeler: 
kbmt kbtshoot kbcrt kbprb KB172396 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:172396  (http://support.microsoft.com/kb/172396/en-us/ )