Question

Je suis en train de créer une dll Win32 C ++ avec des données globales. Il y a un std :: carte définie globalement et il exporte des fonctions dans le dll qui écrivent des données dans la carte (après l'acquisition d'un verrou d'écriture, ofcourse).

Mon problème est, quand je l'appelle la fonction d'écriture à l'intérieur du DllMain dll, cela fonctionne sans aucun problème. Mais quand je charge le dll d'un autre programme et appeler la fonction qui écrit des données dans la carte du monde, il me donne cette erreur:

WindowsError: exception: access violation reading 0x00000008

Y at-il quelque chose qui peut être fait à ce sujet? La même fonction lorsqu'il est appelé à partir DllMain a accès aux données globales dans le dll, mais lorsqu'il est appelé à partir d'un processus différent, il n'a pas accès aux données mondiales. S'il vous plaît conseiller.

J'utilise le TDM-gcc 4.4.0 du compilateur MinGW.

EDIT: Ok, je l'ai compris ce que le problème est, et merci pour l'aide les gars, mais le problème n'a pas été un problème de constructeur ou de l'incapacité d'avoir des cartes dans l'espace mondial, mais un problème dans le boost :: python que je suis en utilisant. Je l'avais testé, mais comme je l'appelais la dll à partir de python ou peut-être quelque chose, le module urllib2 ne recevais pas chargé dans le dll. Maintenant, je dois voir comment y remédier.

Était-ce utile?

La solution

On dirait que le constructeur de std::map n'a pas encore exécuté lorsque votre code a été appelé. Durée de vie des non-pods globaux dans une DLL Win32 est assez difficile, et je ne suis pas certain de la façon dont MinGW traite spécifiquement. Mais il se peut que la façon dont vous compilez la DLL, vous avez défini votre propre fonction (DllMain?) Comme point d'entrée, et donc l'emportaient sur la routine d'initialisation du CRT qui appelle les constructeurs.

Autres conseils

Une erreur de lecture à une telle adresse mémoire faible signifie généralement que vous essayez d'accéder à un pointeur NULL quelque part. Pouvez-vous montrer votre code réel?

Vous devez utiliser la mémoire partagée, parce que les différents processus ont des espaces d'adressage séparés. Je pense que vous ne serez pas std :: carte course. Je recommanderais d'utiliser MapViewOfFile, CreateFileMapping, OpenFileMapping, ... et les données pures et simples. Demandez Google / MSDN.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top