Comment activer les contrôles communs dans une application Windows
Je suis en train d'activer les contrôles communs dans une application. J'ai suivi les étapes indiquées dans cet article MSDN, en particulier la section À l'aide de ComCtl32.dll la Version 6 dans une Application Qui Utilise Uniquement des Extensions du Standard. Mais je ne peux pas le faire fonctionner.
La seule chose que je suis en train de faire différemment de l'article est que j'ai ajouter de l'information manifeste dans Pages de propriétés du Projet | Propriétés de Configuration | Gestionnaire | Fichier Manifest | Manifeste Dépendances. C'est ce que je entrer dans la zone de texte:
"type=" Win32 "name=" Microsoft.De Windows.Commune-Contrôle' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'";%(AdditionalManifestDependencies)
Lorsque je vérifie le générés manifeste (MyApp.exe.intermédiaire.le manifeste), il semble correct.
J'ai aussi ajouter un lien de dépendance à ComCtl32.lib dans Propriétés du Projet | Propriétés de Configuration | Gestionnaire | Entrée | Dépendances Supplémentaires. J'ai aussi appeler InitCommonControlsEx au démarrage avec la structure INITCOMMONCONTROLSEX initialisé comme ceci:
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;
Mais l'appel à la InitCommonControlsEx renvoie toujours FALSE (ce qui signifie qu'il a échoué). Après quelques recherches, j'ai découvert que le code d'erreur renvoyé par GetLastError est ERROR_FILE_NOT_FOUND. Quel pourrait être le problème?
Mise à JOUR: j'ai remarqué quelque chose qui pourrait être liée à la "fichier introuvable". Quand je lance l'application à partir du débogueur, l'une des lignes dans la fenêtre de Sortie est:
'MyApp.exe': Chargé 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002.18305_none_88f3a38569c2c436\comctl32.dll', Ne peut pas trouver ou ouvrir le fichier PDB
Cependant, il ya un tas de lignes similaires pour certaines bibliothèques standard comme kernel32.lib, user32.lib, etc:
'MyApp.exe': Chargé 'C:\Windows\System32\ntdll.dll', Ne peut pas trouver ou ouvrir le fichier PDB
'MyApp.exe': Chargé 'C:\Windows\System32\kernel32.dll', Ne peut pas trouver ou ouvrir le fichier PDB
'MyApp.exe': Chargé 'C:\Windows\System32\msvcrt.dll', Ne peut pas trouver ou ouvrir le fichier PDB
'MyApp.exe': Chargé 'C:\Windows\System32\user32.dll', Ne peut pas trouver ou ouvrir le fichier PDB
Ces lignes apparaissent toujours pour n'importe quelle application, et il ne cause pas de problèmes. Pourrait-il être différent pour ComCtl32.dll?
Il a essayé, n'a pas fonctionné.
Avez-vous pensez à téléphoner InitCommonControls() (pas l'Ex-verson) comme la première ligne de WinMain. Ne serait-ce pas le travail? Ou essayez-vous d'obtenir l'un des nouveaux styles visuels?
OriginalL'auteur user1610015 | 2012-12-20
Vous devez vous connecter pour publier un commentaire.
OK. J'ai fait quelques devoirs et de découvrir quelque chose de nouveau moi-même. Comment j'ai finalement obtenu ce travail a été presque ce que vous essayez de faire:
Entrez le texte suivant verbatim (ce qui signifie que tous les guillemets simples et doubles exactement comme ci-dessous). C'est sur une seule ligne, btw.
"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
Enregistrer vos paramètres d'un faire un projet COMPLET (si pas de solution), de se reconstruire à force de manifester et de PCH régénération.
Avant de le faire ce qui suit a été à ma charge-liste:
Après la main-forcnig la version du manifeste pour les contrôles communs, la liste de chargement comprend maintenant ce (et correctement réponses fidèle à
InitCommonControlsEx()
, qui est le point de tout cela, en premier lieu):Remarque: vous pouvez également le faire avec une source #pragma, idéalement dans votre stdafx.h-tête, mais je préfère de cette façon.
Espère que cela aide.
OriginalL'auteur WhozCraig
Non, les mises en garde sur les fichiers PDB sont juste là pour vous dire que vous n'avez pas les informations de débogage pour les Dll système de Windows. L'obtention d'un FAUX retour de InitializeCommonControlsEx() est bien sûr la clé du problème.
Il ya quelque chose de mal avec le Manifeste des Dépendances de la chaîne que vous utilisez. J'ai bricolé avec elle pendant un certain temps, mais ne pouvait pas trouver la faille. Il est souvent plus facile de spécifier les options du linker dans votre code source. Tout a bien fonctionné lorsque j'ai utilisé:
Il suffit de copier et de coller le code ci-dessus extrait de l'un de vos fichiers source.
OriginalL'auteur Hans Passant