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.
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.
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.
Ş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
//---------------------------------------------------------
// 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();
}
Ö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/
)
Bu makaleyi kullanmak için ne kadar kişisel çaba harcadınız?
Çok az
Az
Orta
Fazla
Çok fazla
Bu bilgiyi geliştirmemiz için nedenleri ve bu konuda neler yapabileceğimizi paylaşın
Teşekkürler! Görüşleriniz, destek içeriğimizi geliştirmemize yardımcı olmak için kullanılmaktadır. Diğer yardım seçenekleri için, lütfen Yardım ve Destek Giriş Sayfasını ziyaret edin.