dll- Zugriffsverletzung nach Referenzübergabe
-
Hallo zusammen,
ich bin auf meiner Recherche auf dieses Forum gestossen und dachte mir, vielleicht kann mir hier jemand eine Hilfestellung zu einem Problem geben, welches mich gerade plagt.
Ich habe beispielhaft folgendes Struct erstellt:
struct SRow { std::hash_map<const char*, const char*> field; };und eine Klasse:
class CTestStruct { public: CTestStruct(void); ~CTestStruct(void); bool CTestStruct::sqlQuery(std::vector<SRow*>* v); };das CTestStruct::sqlQuery sieht nun folgendermaßen aus:
bool CTestStruct::sqlQuery(std::vector<SRow*>* v) { int i; for (i = 0; i < 10; ++i) { SRow *r = new SRow(); r->field["test"] = "test"; v->push_back(r); } return 1; }Soweit, so gut. Ich kann sie nun aus irgendeiner Klasse herraus so z.b. aufrufen:
CTestStruct testStr; std::vector<SRow*> *rows = new std::vector<SRow*>; testStr.sqlQuery(rows); SRow *r = rows->at(0); std::cout << r->field["test"] << std::endl;Das funktioniert auch alles wunderbar. Nun beim Problem: Die Klasse CTestStruct soll in eine DLL. Ich gebe sie nach aussen hin mit dem Macro AFX_EXT_CLASS frei.
Wenn ich aber nun den obigen Code nutze um auf CTestStruct zuzugreifen bekomme ich an der Position r->field["test"] einen Zugriffsfehler. Ich darf scheinbar nicht auf das struct zugreifen.
Es wäre suuper, wenn da jemand ein Tipp für mich hättte, vielen Dank!
Schuemi
-
Was heisst Du bekommst einen "Zugriffsfehler"? Stürtzt Dein Programm ab?
Wenn Du solche Klassen in DLLs auslagern willst, so *muss* die DLL die DLL-Version der CRT (und MFC, wenn verwendet) verwenden und mit dem *gleichen* VS-Compiler erzeugt worden sein!
-
Hi!
Es kommt folgende Fehlermeldung:
Unbehandelte Ausnahme bei 0x102157d0 (msvcr71d.dll) in dllTest.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000000.
Das Programm "[3516] dllTest.exe: Systemeigen" wurde mit Code -1073741819 (0xc0000005) beendet.Und diese kommt, wenn der Befehl "r->field["test"]" ausgeführt werden soll. Genauer gesagt bleibt er in Microsofts strlen.asm an einer stelle stehen, wo er versucht die länge des char* rauszukriegen. Ich nehme an, das ist einfach der erste versuch auf das char* zuzugreifen.
ich benutze VC++ 2003 .net, die DLL und das Testprogramm habe ich am selber rechner compeliert. Die CRT ist die von VC, ich denke nicht das die falsch sein könnte, oder doch?
-
Schuemi schrieb:
Hi!
Es kommt folgende Fehlermeldung:
Unbehandelte Ausnahme bei 0x102157d0 (msvcr71d.dll) in dllTest.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000000.
Das Programm "[3516] dllTest.exe: Systemeigen" wurde mit Code -1073741819 (0xc0000005) beendet.
...Die STL von Microsoft ist leider nicht für den Export aus DLLs gedacht

(siehe http://support.microsoft.com/kb/168958/en-us ).
Dort stehen auch Möglichkeiten mit denen Du Container aus einer DLL exportieren kannst. Mir war das zu aufwändig.
Alternativ kannst Du auch eine andere STL Implementierung benutzen (STL-Port).Grüsse
karl-heinz
-
Hallö,
och nö... das ist ja ätzend. Ich probiere es mal mit der STL von Microsoft.
Vielen Dank!
-
Schuemi schrieb:
Hallö,
och nö... das ist ja ätzend. Ich probiere es mal mit der STL von Microsoft.
Vielen Dank!
hmmm... die STL von Microsoft funktioniert doch nicht, oder

-
ich meine so, wie es auf der Seite How to export an instantiation of a Standard Template Library (STL) class and a class that contains a data member that is an STL object bei MS steht.
... oder ich nehme doch lieber STLport. Ist wohl einfacher und ich hätte warscheinlich weniger Probleme, das ganze doch mal auf Linux portieren muss...
-
Du musst die *DLL*-Version der CRT verwenden!!!!! Siehe "Projekteinstellungen|C/C++|Code generation|Runtime Library" und dort muss was mit "DLL" stehen!!!
-
jo, mache ich, ich nutze die Multithreaded-Debug-DLL (/MDd) als Laufzeitbibliothek in beiden Projekten...