2012-07-21 5 views
1

J'ai une application MFC développée avec Visual Studio 2008 dans laquelle j'utilise le contrôle Adobe ActiveX (j'ai installé Adobe Reader X). J'essaie de définir le rectangle de zoom en utilisant la fonction setViewRect et cela fonctionne parfaitement.Contrôle ActiveX - Paramètres régionaux MFC

Maintenant, le problème apparaît lorsque dans mes paramètres régionaux de Windows, le symbole décimal est réglé sur virgule au lieu de point (comme dans les paramètres régionaux allemands). Les paramètres du rectangle de zoom semblent être mal interprétés. J'ai utilisé ProcessMonitor et découvert que lorsque Adobe ActiveX Control est créé et que sa DLL est chargée dans mon processus, elle appelle setlocale, et donc l'application utilise les paramètres régionaux Windows actuels au lieu des paramètres régionaux «C» par défaut. Par conséquent, l'application interprète les nombres d'une manière incorrecte.

J'ai essayé de réinitialiser les paramètres régionaux à "C" juste après le chargement d'Adobe et cette solution de contournement a résolu le problème.

Maintenant, le problème s'est reproduit lorsque j'ai migré mon application vers Visual Studio 2010. Apparemment Adobe DLL ("c: \ Program Files (x86) \ Fichiers communs \ Adobe \ Acrobat \ ActiveX \ AcroPDF.dll") est développé en utilisant Visual Studio 2008. Donc, quand il définit les paramètres régionaux, il est fait dans MSVCR90.dll. Lorsque j'ai réinitialisé les paramètres régionaux, je l'ai fait en utilisant la même DLL. Maintenant que mon application est dans VS2010, appeler setlocale est fait dans MSVCR100.dll, donc il n'affecte pas les paramètres régionaux déjà définis dans MSVCR90.dll.

Est-il possible de définir les paramètres régionaux de l'objet COM que j'héberge dans mon application?

Merci beaucoup à l'avance :)

Répondre

0

Ceci est juste un coup de feu dans l'obscurité, mais vous pouvez essayer de charger msvcr90.dll avec LoadLibrary (depuis la DLL est déjà chargé, il vous reste plus qu'à vous donner un HANDLE, il ne le chargera pas deux fois), puis trouve le pointeur sur sa fonction setlocale avec GetProcAddress. Ensuite, vous pourrez appeler la fonction setlocale pour cette DLL. C'est un hack moche, mais ça pourrait marcher.

+0

Merci satuon pour votre réponse :) J'ai essayé de le faire, mais malheureusement LoadLibrary (_T ("MSVCR90.dll")) renvoie un handle NULL. Cela fonctionne seulement quand je LoadLibrary avec le plein chemin à MSVCR90.dll (C: \\ Windows \\ winsxs \\ x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_50934f2ebcb7eb57 \\ msvcr90.dll) qui n'est pas faisable à faire. – dood

+0

Mais cela a-t-il fonctionné lorsque vous avez essayé avec le chemin complet? – sashoalm

+0

Oui, il l'a fait :) Merci pour le conseil :) Je ne peux simplement pas utiliser le chemin complet dans mon application. – dood

Questions connexes