[STL vector in DLL] Hoe vector exporten...

Pagina: 1
Acties:

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
f:\cvslocalroot\win32\win32\workspace\cactivity.h(46) : warning C4251: 'registrations' : class 'std::vector<class CRegistration *,class std::allocator<class CRegistration *> >' needs to have dll-interface to be used by clients of class 'CActivity'
Tijdens compilen krijg ik deze warning.

In de DLL zit een class die een vector als member heeft. Deze class is geexporteerd in de DLL. Alle methoden van de class werken perfect. Wanneer ik echter de vector "get" en vervolgens een transactie erop loslaat, dan krijg ik error dat een pointer van een waarschijnlijk van de verkeerde heap komt. Althans dat staat in het commentaar bij de assert die ik krijg. Deze assert staat in STL source...

Ik dacht het zit dezelfde adres ruimte. Niet dus blijkbaar.

De vector haal ik buiten de class om snel een iteratie ervan te doen zodat ik de inhoud kan printen. Iemand enig idee hoe ik dit op kan lossen? ALs ik die warning weg kan krijgen, dan heb ik het vermoeden dat ik het opgelost heb. Maar ik snap de oorzaak van de warning niet. :'(

OiSyN, weet jij het.. :P

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
De class (heb niet relevante zaken eruit gestripped).

WORKSPACEAPI is gedeclareerd als:
__declspec(dllexport)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef vector<CRegistration *> REGISTRATIONS;

class WORKSPACEAPI CActivity
{
    public:
        CActivity(char * name, time_t deadline, char * notition);
        ~CActivity();
        //..
        REGISTRATIONS getRegistrations();
        //..
    private:
        //..
        REGISTRATIONS registrations;    // Vector with registrations.
        //..
};

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op vrijdag 28 december 2001 15:55 schreef The - DDD het volgende:

[..]

Tijdens compilen krijg ik deze warning.

In de DLL zit een class die een vector als member heeft. Deze class is geexporteerd in de DLL. Alle methoden van de class werken perfect. Wanneer ik echter de vector "get" en vervolgens een transactie erop loslaat, dan krijg ik error dat een pointer van een waarschijnlijk van de verkeerde heap komt. Althans dat staat in het commentaar bij de assert die ik krijg. Deze assert staat in STL source...
Dinkumware heeft een patch waarmee alle STL classes over DLL grenzen werken, alleen dacht ik dat die nodig was voor std::[multi]map|set, niet std::vector.

Die zou je kunnen proberen. Zoniet, probeer dan de MS newsgroups.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Ik heb dit Knowledge base artikel kunnen vinden in de MSDN:
HOWTO: Exporting STL Components Inside & Outside of a Class

Maar volgens mij mis ik iets..

Ik krijg namelijk alleen maar meer errors als ik dat artikel toepas.

Hierover gaat ie al op zijn bek:
code:
1
template class __declspec(dllexport) vector<CClass *>;

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op vrijdag 28 december 2001 19:31 schreef The - DDD het volgende:
code:
1
template class __declspec(dllexport) vector<CClass *>;
Het werkt.. Eindelijk...
Weet je wat de fout was?

Ik had std::vector moeten doen. Denk je misschien dat je daar niet eerder aan dacht, sukkel. Nou, ik had dus wel netjes "using namespace std;" bovenaan mijn source staan.

Dat std:: was ALLES. Verdorie...

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op maandag 31 december 2001 00:43 schreef The - DDD het volgende:

[..]

Het werkt.. Eindelijk...
Weet je wat de fout was?

Ik had std::vector moeten doen. Denk je misschien dat je daar niet eerder aan dacht, sukkel. Nou, ik had dus wel netjes "using namespace std;" bovenaan mijn source staan.

Dat std:: was ALLES. Verdorie...
apart, en weet je ook _waarom_ je expliciet std:: moest gebruiken?
Ik gebruik namelijk ook vaak using namespace std; ;)

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Als ik hem zonder dat STD:: compile geeft VC++ dit:
f:\cvslocalroot\win32\win32\workspace\cactivity.h(50) : error C2059: syntax error : '<'
CProject.cpp
f:\cvslocalroot\win32\win32\workspace\cactivity.h(50) : error C2059: syntax error : '<'
f:\cvslocalroot\win32\win32\workspace\cproject.h(47) : warning C4251: 'activities' : class 'std::vector<class CActivity *,class std::allocator<class CActivity *> >' needs to have dll-interface to be used by clients of class 'CProject'
CWorkspace.cpp
f:\cvslocalroot\win32\win32\workspace\cactivity.h(50) : error C2059: syntax error : '<'
f:\cvslocalroot\win32\win32\workspace\cproject.h(47) : warning C4251: 'activities' : class 'std::vector<class CActivity *,class std::allocator<class CActivity *> >' needs to have dll-interface to be used by clients of class 'CProject'
Voeg ik std:: weer toe dan zijn die dus allemaal weg.

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Oh ja, voor de volledigheid...

Je moet vanuit je DLL en de importerende code (DLL of EXE) linken naar dezelfde C++ runtime library.. Dus of de DLL-versie of de static versie. Tevens moet je daarbovenop ook linken naar hetzelfde type build. Dus of de normale DLL/static library of de debug DLL/static library.

Verder is de vector de enige STL container die geexporteerd kan worden vanuit een DLL. De andere STL componenten moet je wrappers omheen schrijven. Zodat de interne werking van de STL container niet naar buiten gebracht kan worden. Dit heeft weer te maken met het feit dat de C++ runtime library gebruik maakt van thread local storage. Hoe ze het dan met de DLL runtime library wel kan, maar daar weer buiten in je eigen libraries niet (exporten van STL containers anders dan een vector).

het is bovendien zowiezo verstandig om te linken naar de DLL runtime indien mogelijk. Kan je bakken met geheugen schelen. Stel dat je 10 apps hebt draaien die static gelinked zijn. Da's dan wel even 10 keer de runtime library in je geheugen, terwijl 1 keer genoeg is. TLS (thread local storage) verzorgd de correcte werking van de library.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op vrijdag 28 december 2001 15:55 schreef The - DDD het volgende:

OiSyN, weet jij het.. :P
haha sorry dude, je had C++ voor je topictitel moeten zetten, want hij is me totaal niet opgevallen :)

Ik verveel me nu en toen keek ik in P&W en toen zag ik ineens: heej een topic van The - DDD, eens kijken wat hij te melden heeft (behalve 2 zijn alle reacties overigens van jezelf :D)

Maar nee, ik wist het niet... ik gebruik ook nooit de STL :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Op maandag 31 december 2001 02:03 schreef OiSyN het volgende:
(behalve 2 zijn alle reacties overigens van jezelf :D)
Komt wel een beetje scizofreen over, of niet... :P

Enne STL betekent indirect C++. Dus, waar bleef je zo lang? >:)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

ja maar het woord STL pakt mijn ogen niet... als ergens C++ staat dan zie ik dat direct, maar op STL let ik gewoon niet :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op maandag 31 december 2001 01:41 schreef The - DDD het volgende:
Oh ja, voor de volledigheid...

Je moet vanuit je DLL en de importerende code (DLL of EXE) linken naar dezelfde C++ runtime library.. Dus of de DLL-versie of de static versie. Tevens moet je daarbovenop ook linken naar hetzelfde type build. Dus of de normale DLL/static library of de debug DLL/static library.

Verder is de vector de enige STL container die geexporteerd kan worden vanuit een DLL. De andere STL componenten moet je wrappers omheen schrijven. Zodat de interne werking van de STL container niet naar buiten gebracht kan worden. Dit heeft weer te maken met het feit dat de C++ runtime library gebruik maakt van thread local storage. Hoe ze het dan met de DLL runtime library wel kan, maar daar weer buiten in je eigen libraries niet (exporten van STL containers anders dan een vector).
Dan heb je waarschijnlijk de STL patches van www.dinkumware.com niet.
The header <xtree> (original 25 June 1998) presented here eliminates all need for thread locks and corrects a number of thread-safety issues for template classes map, multimap, set, and multiset. It also solves some nasty problems with sharing these classes across DLLs. Note that no attempt has been made to retrofit the changes needed to make these template classes exception safe in the sense required by the final C++ Standard.
( van /vc_fixes.html )

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1