2011-04-20 3 views
1

j'ai un exe chargeant un dll. J'ai écrit les deux.chaîne attachée par dllexported est corrompue

Je dllexporting une fonction foo qui retourne un std :: wstring.

tout ce qu'il fait est de dire

std :: wstring bla = L "rgjwgfw";

return blah.append(L"hey"); 

dans l'exe où j'importe foo, la chaîne est corrompue. dès que je reviens de la fonction où j'appelle foo je reçois des assertions échouées. Parfois, je reçois un message disant que Windows a déclenché un point d'arrêt dans foo.exe. cela peut être dû à une corruption du tas, etc ... Cela peut aussi être dû à un utilisateur appuyant sur f12 alors que foo.exe a le focus. etc ....

une idée pourquoi cela se produit? cela ne se produit pas si je supprime la ligne append de foo et jsut renvoie la chaîne d'origine, il n'y a pas de problèmes.

merci

+0

Êtes-vous sûr que les deux DLL sont compilées avec les mêmes options (release ou debug)? Les modèles STL peuvent avoir des tailles différentes –

Répondre

3

Ceci est un problème assez commun. Vous devez lier à la fois la DLL et l'exécutable pour utiliser la bibliothèque standard dans une DLL. De cette façon, ils partagent une copie commune de la bibliothèque standard un tas commun. Sinon, vous finissez avec le code dans l'exécutable essayant d'utiliser un tas, et le code dans la DLL en utilisant un tas séparé. Lorsque vous passez presque tout ce qui utilise l'allocation dynamique à travers la frontière, chacun suppose que le tampon dynamiquement alloué dans l'objet provient de son propre tas. Presque toute manipulation peut non seulement corrompre l'objet, mais aussi tout le tas.

+0

Je ne peux pas faire cela parce que je lie statiquement contre mfc. l'utilisation de la DLL runtime dll nécessite une liaison dynamique avec mfc. est-il un moyen de le faire sans faire de la fonction le genre de fonction que vous appelez deux fois? Une fois pour obtenir la longueur du tampon, puis une autre fois pour remplir réellement le tampon avec les données? – bdwain

+0

Je suppose que tout ce que vous pouvez faire à ce stade est d'utiliser une classe de chaînes différente qui a tout son code dans la DLL (le problème vient en grande partie du fait que l'allocateur est un argument template, donc l'instanciation est séparée) . –

Questions connexes