2009-07-06 7 views
0

Quelqu'un at-il une idée de l'échec de CoCreateInstance sur ITaskBarList3 sous Windows 7 64 bits? Le code d'erreur est 0x80040154, qui est la classe non enregistrée.CoCreateInstance échoue avec 0x80040154 sur ITaskBarList3

Le code d'appel (VB6) est:

Public Const IID_ITaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" 
Public Const CLSID_TaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" 

'.... 

Dim IID As GUID_API 
Dim CLSID As GUID_API 

Dim iTaskBarVB3 As ShellLib.ITaskbarList3 

rc = CLSIDFromString(StrPtr(CLSID_TaskbarList3), CLSID) 
rc = IIDFromString(StrPtr(IID_ITaskbarList3), IID) 
rc = CoCreateInstance(CLSID, 0, CLSCTX_SERVER, IID, iTaskBarVB3) 

Les retours de CLSIDFromString et IIDFromString sont tous deux 0 (succès). Je peux trouver la chaîne dans le registre. Comme ma barre des tâches fonctionne bien, je sais que l'interface peut être appelée par d'autres processus.

ITaskBarList3 est déclaré dans une typelib compilée à l'aide de mktyplib.exe. J'ai vérifié les valeurs GUID, et ils correspondent à ceux dans le SDK.

Toute aide serait grandement appréciée.

+0

Je n'ai jamais vu un ID de classe étant égal à l'ID de l'interface. Peut-être que ça marcherait de temps en temps mais c'est typique de les avoir différents. – sharptooth

+0

@sharptooth: Moi non plus, je n'ai jamais vu les deux comme identiques.Mais, OMI, cela pourrait fonctionner puisque les deux ont des sections différentes dans le Registre et la recherche pour les deux est à des endroits distincts. Cela dit, cela ne devrait pas être fait. Mais je suis curieux de savoir pourquoi cela ne fonctionnera pas? – Aamir

+0

Je suppose que cela fonctionnerait, mais voir un tel code est très suspect. – sharptooth

Répondre

0

Le ClassID n'était pas le problème, car cela a fonctionné correctement il y a une semaine. Je compilais précédemment sur Windows Vista, 32 bits.

J'ai maintenant mis à jour mon système à Windows 7, 64 bits. Le problème n'est pas une question de compatibilité 32/64-bit. Le TaskBar est accessible via Wow64, et je suis capable d'appeler l'interface très bien à partir d'une DLL ATL 32 bits.

J'ai fait un peu plus de recherche, et j'ai trouvé un certain nombre de références sur le web concernant les problèmes avec actxprxy.dll sur Windows 64 bits. C'est la DLL où les interfaces semblent résider, selon OLE Viewer.

De toute façon, certaines personnes ont eu de la chance avec diverses combinaisons de scripts .reg et la désinscription/ré-enregistrement des fichiers. Malheureusement, je ne suis pas une de ces personnes.

J'ai décidé de me sauver le mal de tête, et j'ai juste écrit une petite DLL en utilisant ATL, et j'ai appelé le code VB. Fonctionne bien dans cette configuration ...

Merci encore pour votre aide.

4

La raison la plus probable est que le code appelant est 32 bits et que le serveur COM est 64 bits et ne peut donc pas être chargé en tant que serveur in-proc.

Une solution possible pourrait être de créer une application COM + pour que le serveur COM force sa création en tant que serveur externe. Cependant, cela n'aidera pas si le serveur COM est destiné à fournir un contrôle ActiveX.

Je suis également surpris de voir que l'identifiant de la classe est égal à l'identifiant de l'interface - c'est une pratique courante de les avoir différents. Puisque vous n'êtes pas le développeur du composant implémentant cette interface mais seulement le consommateur, il est probable que vous ayez simplement égaré l'identifiant de la classe avec l'ID de l'interface et c'est la raison pour laquelle votre programme client ne fonctionne pas. Vous devez trouver l'ID de classe de la classe implémentant l'interface ITaskBarList3 et l'utiliser comme ID de classe.

1

CLSID_TaskbarList3 n'existe pas! C'est simplement CLSID_TaskbarList = "{56FDF344-FD6D-11D0-958A-006097C9A090}", qui a en effet un GUID différent de l'IID IID_TaskbarList3.

Dans COM, vous avez généralement une classe implémentant une ou plusieurs interfaces. Il n'existe généralement pas de nouvelle classe pour chaque interface.

Questions connexes