2009-03-20 15 views
7

Będąc nowicjuszem w bibliotece DLL, muszę zapytać wszechmocnego SO o coś.Importowanie instancji klasy instancji z biblioteki dll

Say I wyraźnie wystąpienia klasy szablonu tak:

template class __declspec(dllexport) B<int>; 

Jak mogę ponownie użyć zaimportować szablonie klasy?

Próbowałem dodanie poniższy kod w moim pliku .cpp, gdzie chcę użyć b

template class __declspec(dllimport) B<int>; 
+0

"Próbowałem dodać kod poniżej w moim pliku .cpp, w którym chcę użyć B", co odkryłeś? czy dostałeś błędy? czy możesz zadać pytanie, co się wtedy wydarzyło? –

Odpowiedz

4

Podczas wystąpienia szablonu w pełni - masz kompletny typ. Nie różni się od innych typów. Należy dołączyć nagłówek dla B, a także połączyć w czasie kompilacji z plikiem lib lub dynamicznie załadować bibliotekę dll, aby utworzyć łącze do definicji.

Czytasz ten artykuł: http://support.microsoft.com/kb/168958?

Oto krótkie podsumowanie tego, co testowałem (i to działało):


Tworzenie obojętne projekt DLL

  • użyciu kreatora aplikacji Win32 Console wygenerować nagłówek dll/pliki źródłowe o nazwie: template_export_test
  • Dodano następujące elementy:

file: template_export_test.h


#ifndef EXP_STL 
#define EXP_STL 
#endif 

#ifdef EXP_STL 
# define DECLSPECIFIER __declspec(dllexport) 
# define EXPIMP_TEMPLATE 
#else 
# define DECLSPECIFIER __declspec(dllimport) 
# define EXPIMP_TEMPLATE extern 
#endif 

EXPIMP_TEMPLATE template class DECLSPECIFIER CdllTest<int>; 

file: template_export_test.cpp


template<class T> 
CdllTest<T>::CdllTest(T t) 
: _t(t) 
{ 
    std::cout << _t << ": init\n"; 
} 

Tworzenie aplikacji testowej

  • Użyj kreatora, aby utworzyć aplikację Win32 Console nazwie: driver
  • Edytuj ustawienia projektu łącznika według tego projektu:
    • Dodaj do Linker> Ogólne> dodatkowe katalogi biblioteczne: ścieżka do template_export_test.lib
    • Dodaj do Linker> Wejście> Dodatkowe zależności: template_export_test.lib
  • Dołącz template_export_test.h w głównym pliku cpp

#include "c:\Documents and Settings\...\template_export_test.h" 
using namespace std; 

int main(int argc, char** argv) { 
    CdllTest<int> c(12); 
} 

  • skompilować i gotowe!
+0

Próbowałem: szablon szablonu zewnętrznego __declspec (dllimport) B ; Nie działa. – Nailer

+0

Dzięki za link. Jednak sądzę, że Twoja próbka nie działa poprawnie. #ifndef EXP_STL #define EXP_STL jest nieprawidłowy i niezgodny z podanym linkiem. –

0

Wygląda na to, że nawet po wyraźnym wprowadzeniu szablonu mogą pojawić się problemy prowadzące do błędów w czasie wykonywania. Spójrz na this interesting article to C4251 (szczególnie "Wniosek").

Powiązane problemy