Erreur OLE - classe non enregistrée sur une machine

stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010 - 28 juil. 2010 à 17:10
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010 - 2 août 2010 à 09:53
Bonjour,

J'ai une application VFP9 contenant notamment des formulaires avec des contrôles TreeView "version 1", s'appuyant sur COMCTL32.OCX. Pour ces contrôles :
- OLETypeAllowed = -2 - ActiveX Control
- OLEClass = COMCTL.TreeCtrl.1
- ParentClass = Olecontrol

Cette application est habituellement installée en ajoutant notamment COMCTL32.OCX (version 6.0.81.5) sur le poste utilisateur (s'il n'est pas déjà présent), puis en l'enregistrant avec "regsvr32".

L'application fonctionne normalement ainsi sur de nombreux ordinateurs avec diverses versions de Windows, sauf sur un Windows Server 2003 avec Office 2007 : une erreur "Code d'erreur OLE 0x80040154: Classe non enregistrée. Objet OLE ignoré. N° d'enregistrement 19." apparait à chaque ouverture d'une fenêtre contenant un contrôle TreeView. Pourtant, "regsvr32 COMCTL32.OCX" s'exécute sans erreur sur cet ordinateur.
Ce genre d'erreur est parfois arrivé sur d'autres postes utilisateurs par le passé, mais à chaque fois résolu en ré-exécutant "regsvr32 COMCTL32.OCX".
Par ailleurs, j'ai tenté de reproduire le phénomène sur un autre ordinateur de test avec Windows Server 2003 et Office 2007 : l'erreur ne se produit pas et les fenêtres avec TreeView s'affichent normalement !

J'ai essayé de comparer les versions de la DLL COMCTL32.DLL présente sur ces ordinateurs, pensant qu'une version très récente mise à jour par l'installation d'Office 2007 pourrait provoquer le phénomène. Difficile de savoir à quoi s'en tenir car il existe souvent plusieurs exemplaires de cette DLL : 1 exemplaire dans \Windows\system32\ + 1 ou plusieurs autres dans des répertoires \WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_.....\, la DLL réellement prise en compte lors de l'instruction "regsvr32 COMCTL32.OCX" n'étant visiblement pas celle de \Windows\system32\ (vu grâce aux outils "process monitor" et "process explorer") !

Toute piste ou retour d'expérience est bienvenu.
- quel OCX / DLL est réellement en cause ?
- COMCTL32.DLL doit-elle être à une version précise pour utiliser un objet COMCTL.TreeCtrl.1 ? Dans quel sous-répertoire de \Windows\ ?
- Est-il nécessaire de modifier les TreeView des formulaires VFP pour passer en "version 2" (OLEClass = MSComctlLib.TreeCtrl.2) s'appuyant sur MSComctl.OCX, lorsqu'on souhaite utiliser l'application dans des environnements "récents" ? Cela représente un travail conséquent pour mon application.

Merci d'avance.

4 réponses

Mike Gagnon Messages postés 381 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 24 octobre 2013 2
30 juil. 2010 à 12:46
Dépendant de la version de Windows, il est préférable d'enregistrer les OCX en niveau administrateur.
Il est possible que lors de l'enregistrement, le message reçu soit positif, mais aucun autre utilisateur peux utiliser le composant.

Assure toi que celui qui enregistre le OCX sur l'oridinateur soit au moins l'administrateur de l'ordinateur. Les choses se complique encore plus lorsque le parle de Vista et Windows 7.

Mike Gagnon
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
30 juil. 2010 à 13:58
Merci de cette réponse.

L'ordinateur sur lequel se pose mon problème est sous Windows Server 2003 avec Office 2007. Je précise "avec Office 2007" puisque le problème ne se produisait pas lorsqu'il n'y avait pas encore Office 2007, mais hélas cet ordinateur doit obligatoirement l'avoir. C'est pour cela que je pensais à regarder les DLL éventuellement mises à jour par Office 2007, qui sont aussi en dépendances du COMCTL32.OCX.

Sur cet ordinateur, les OCX ont bien été enregistrés sous le compte administrateur (il est de toute façon en général impossible d'exécuter la commande "regsvr32" sans être administrateur). Cependant, l'erreur "Code d'erreur OLE 0x80040154: Classe non enregistrée. Objet OLE ignoré. N° d'enregistrement 19." apparait en utilisant mon application sous ce même compte administrateur.
0
Mike Gagnon Messages postés 381 Date d'inscription vendredi 15 octobre 2004 Statut Membre Dernière intervention 24 octobre 2013 2
31 juil. 2010 à 04:02
Donc il y possible qu'en installant Office 2007, l'ocx original de ton application a perdu son enregistrement dans la base de registre.
Le meilleur endroit pour mettre les OCX pour ne pas qu'ils se fassent écrasé avec des nouvelles versions,est dans le répertoire de l'application meme.

Mike Gagnon
0
stepber Messages postés 17 Date d'inscription mardi 24 juin 2008 Statut Membre Dernière intervention 2 août 2010
2 août 2010 à 09:53
Suite à l'installation de Office 2007 sur cet ordinateur, mon application a été réinstallée. Donc ses OCX, dont COMCTL32.OCX, ont été alors enregistrés avec "regsvr32" sans erreur sous le compte administrateur. Office 2007 n'a pas ensuite été modifié, pourtant l'erreur OLE apparait en utilisant mon application sous ce même compte administrateur immédiatement après l'enregistrement des OCX.
Puisque COMCTL32.OCX ne semble pas poser de problème, c'est pour cela que je m'orientais vers les DLL qui sont en dépendances du COMCTL32.OCX, dont notamment COMCTL32.DLL. Est-ce que je dois donc copier toutes ces DLL des répertoires système windows dans le répertoire de mon application avec COMCTL32.OCX (cela concerne kernel32.DLL, user32.DLL, ...) ?
0
Rejoignez-nous