000
01.07.2010, 11:39 Uhr
FreiherrEintritt
|
Noch eine DLL-Frage:
Ich möchte eine Klasse aus einer DLL exportieren, die als Member-Variable einen vector<wstring> enthält. Leut MSDN muss ich dazu ja die die Vector-Klassen-Instanz für wstring erzeugen, damit beim exportieren alle Einzelteile geladen sind. Es klappt aber nicht so wie ich will, außerdem versteh ich das Compilter-Verhalten nicht ganz.
Ein Beispiel:
C++: |
// DLLklasse.h class __declspec(dllexport) EineKlasse { //.... vector<wstring> getVector(); // vector nur als Rückgabe-Typ };
|
Wenn ich das mit (dllimport) in einem anderen Projekt einbinde, muss ich überhaupt nichts ändern, keine Instanzierung vornehmen usw. Weder meckert der Compiler, noch funktioniert das Programm nicht.
Aber:
C++: |
// DLLklasse.h class __declspec(dllexport) EineKlasse { //.... public: vector<wstring> getVector(); // vector nur als Rückgabe-Typ
private: vector<wstring> m_MemberVector; // vector auch als Member };
|
führt erstens zu einer Compiler-Warnung
Code: |
warning C4251: 'EineKlasse::m_MemberVector': class 'std::vector<_Ty>' erfordert eine DLL-Schnittstelle, die von Clients von class 'EineKlasse' verwendet wird
|
und zweitens zum Programm-Absturz...
Warum erfordert Bsp. 2 eine Instanzierung und Bsp.1 nicht?
Wenn ich vor der Klassen-Definition eine Instanzierung vornehme:
C++: |
template class __declspec(dllexport) vector<wstring>;
|
verschiebt sich das Problem in die vector-Vererbungs-Hierarchie und es kommt die Meldung:
Code: |
warning C4251: 'std::_Vector_val<_Ty,_Alloc>::_Alval': class 'std::allocator<_Ty>' erfordert eine DLL-Schnittstelle, die von Clients von class 'std::_Vector_val<_Ty,_Alloc>' verwendet wird
|
Ich hab etwas rumprobiert, aber ich komm nicht drauf, welche Klassen-Templates ich noch instanzieren muss Dieser Post wurde am 01.07.2010 um 11:39 Uhr von FreiherrEintritt editiert. |