2009-07-24 13 views
0

J'ai obtenu une DLL générée sur VC6 et en utilisant wstring, et j'essaie de l'utiliser dans un projet VC9. Dans cette DLL, il existe une classe de niveau supérieur manipulant wstring, appelée UtfString.Pointeur incorrect ou problème de lien lors de la création de wstring à partir de vc6 dll

je suis arrivé tout correctement importé dans mon projet, mais quand je l'appelle:

std::wstring test; 
UtfString uTest(test); 

il ne sera pas lien, même si le prototype de la fonction est dans le répertoire lib ...

L'autre émetteur est que lorsque créer une nouvelle UtfString, et déboguer mon application, le nouveau pointeur est <Bad Ptr>.

Je suspecte un conflit entre VC6 wstring et VC9 wstring mais je ne suis pas sûr. Je veux éviter de modifier la DLL d'origine.

Ce serait génial si quelqu'un pouvait clarifier les choses pour moi, et expliquez-moi quelle est la véritable raison du problème.

Merci d'avance pour votre réponse, Boris

+0

Je pense dll liés à différents runtimes être oui à peu près incompatibles. Quelles sont les erreurs? Quel pointeur? – Eugene

+0

En outre, vérifiez vos paramètres «traiter wchar_t en tant que type intégré». – Eugene

Répondre

2

MÊME N'essayez

les mises en page de chaîne sont différentes, vous ne pouvez pas

faire.

La classe de chaînes est entièrement différente entre VC6 et VC9.

Même si vous étiez en mesure de vous lier, vous risquez de tomber en panne.

Dans VC9 chaînes ont une union qui est tampon de 16 octets pour les petites chaînes et un pointeur pour string s.t. taille()> 15. Dans VC9 wstrings ont une union qui est 8 wchar tampon pour les petites chaînes et un pointeur pour string s.t. taille()> 7. Dans VC6, tout l'espace tampon de chaîne est alloué sur le segment

Vous devez recompiler la DLL si vous passez des chaînes à travers la limite. Il y a aussi d'autres problèmes concernant les itérateurs qui sont trop techniques pour être décrits ici.

désolé dois reconstruisent

+0

Et le nom mangling reflète que les chaînes VC6 et VC9 sont des types vraiment distincts. – MSalters

+0

Merci pour votre réponse, je l'ai compris hier soir. Malheureusement, je ne peux pas recompiler ma DLL avec VC9. Donc mes solutions sont soit de faire un wrapper de chaîne dans VC6, soit de changer les prototypes de fonction et de remplacer le wstring par du caractère char * ou wchar_t –

+0

Savez-vous si je vais rencontrer le même problème avec wchar_t? devrais-je utiliser l'utilisateur char * seulement? –