2009-07-28 4 views
1

(je suis de publier à nouveau ce message depuis je me suis inscrit en tant qu'utilisateur maintenant)problème dans l'hébergement ActiveX sur Vista (dans un Visual Studio 6 application C++) II

Je viens d'installer Visual Studio 6 (SP5) sur une machine Vista Enterprise. J'ai eu quelques problèmes mais je pense que tout est réglé.

Le problème est que mon application VC++ 6 échoue lorsque j'essaie d'héberger un ActiveX. J'ai été capable de le compiler correctement, mais j'ai reçu un message d'avertissement de Vista à propos de rc.exe ("Ce programme a des problèmes de compatibilité connus"). Lorsque je l'ai débogué, j'ai vu que ma classe dérivée de CAxDialogImpl échouait sur sa méthode Create(). La même application a très bien fonctionné sur XP!

Existe-t-il un problème de compatibilité connu? Quelques informations techniques: J'ai vu que CAxDialogImpl :: Create() (je passe NULL ici) appelle AtlAxCreateDialogA, qui à son tour appelle CreateDialogIndirectParamA qui lève une exception générale.

Merci beaucoup, Erik

PS - 1. Je suis administrateur sur ma machine. OS est de 32 bits. 2. Je sais que VS6 n'est pas pris en charge sur Vista mais je n'avais pas le choix depuis que j'ai rencontré des problèmes en essayant de le migrer vers VS 2008.

+0

Une mise à jour: Quand mon dll (mon application Visual C++ est en fait une dll) est appelée par une application com cela fonctionne, mais quand il est appelé par une application .Net, il échoue. –

Répondre

2

OK. J'ai trouvé la raison et la solution.

Il semble s'agir d'un problème de compatibilité DEP. Il était difficile de localiser depuis l'échec de l'application aucune exception/message affiché.

Le problème était dû à d'anciens composants ATL utilisés dans my dll. Les anciennes versions d'ATL génèrent du code machine à l'exécution, puis tentent d'exécuter ce code à partir de pages de mémoire non marquées comme exécutables, provoquant ainsi une violation de DEP si la DEP matérielle est activée.

La différence entre ma machine XP et la machine Vista était en fait dans l'opération DEP - le DEP sur Vista est basé sur le matériel, ce qui a causé le problème.

De plus, j'avais des applications COM qui utilisaient la même DLL et fonctionnaient correctement, mais les applications .Net échouaient parce qu'elles étaient créées avec le drapeau de compatibilité DEP.

La solution consistait à supprimer l'indicateur de compatibilité DEP des applications .Net.

Cheers, Erik

PS - deux liens ont été très utiles: http://support.microsoft.com/kb/948468 How to make my program DEP-compatible?

Questions connexes