2017-07-30 3 views
1

J'ai une solution VS 2010 C++ avec deux projets, l'un génère une DLL et l'autre est le pilote des fonctions DLL. Tous les codes suivantsstd :: string ne peut pas être affecté de valeurs dans la DLL

char cstring [256]; 
strcpy (cstring, "C String"); 
std::string string1 = "Test String"; 
std::string string2 (string1); 
std::string string3; 
string3.assign (cstring); 

fonctionnent bien dans le pilote. Mais si le même code est placé n'importe où dans le projet DLL, aucun de string1, string2 et string3 ne peut être assigné avec des valeurs réussies. Généralement, le débogueur les montre comme Bad Ptr. Il semble qu'ils ne sont pas bien répartis dans la mémoire.

J'ai essayé de placer la chaîne std :: en tant que champs membres de classe, variables automatiques et variables statiques. Mais aucune des méthodes ne fonctionne comme prévu. Quelqu'un peut-il m'aider à trouver la cause?

+0

Problème DLL standard, se produit lorsque votre DLL et le fichier EXE n'utilisent pas exactement la même bibliothèque C++ standard. Pourrait être aussi simple que le EXE construit dans Debug, utilisant ainsi msvcp100d.dll et la DLL intégrée dans Release, utilisant ainsi msvcp100.dll. Construire avec/MT au lieu de/MD est une autre erreur traditionnelle. Les deux projets doivent utiliser la même version du compilateur * exact * et les mêmes paramètres de construction pour qu'une seule copie de la bibliothèque soit utilisée. Diagnostiquer avec Debug> Windows> Modules. –

+0

Peut être vrai. Mais il est difficile de savoir quelles sont les options utilisées pour construire les autres bibliothèques. Aujourd'hui, je viens de découvrir que le pilote et la DLL peuvent fonctionner sans problème dans les installations en dehors de mon environnement VS 2010. Donc, ça sonne un problème de temps d'exécution. – Lucius

+0

Eh bien, si vous ne savez pas alors les chances d'une incompatibilité grimpent à 99,9%. Les programmeurs qui exposent les types std à partir de leur interface DLL ont besoin d'un téléphone, assurez-vous d'en utiliser un. –

Répondre

0

Je pense que la raison de ceci est le manque de norme d'interface binaire d'application (ABI). Ce problème est parfaitement décrit dans ce post: How do I pass objects especially stl objects to and from a dll. Il peut également s'agir de la propriété 'propriétés >> c/C++ >> génération de code >> paramètres de la bibliothèque d'exécution' (paramètres/MT et/MD) dont vous avez besoin pour vous assurer que le projet de bibliothèque et le projet sont identiques.

+0

Oui, il est vrai qu'une chaîne transmise depuis l'extérieur de la DLL est corrompue. Mais la plus grande question est, les chaînes définies localement ne peuvent même pas être initialisées! Ils sont presque tous Bad Ptr. – Lucius

+0

Avez-vous vérifié que les paramètres de la bibliothèque d'exécution sont les mêmes dans les deux projets (dll et implémenteur)? – Treebeard