CoCreateInstance fails with 0x80040154 on ITaskBarList3

0

Does anyone have any idea why CoCreateInstance would be failing on ITaskBarList3 on Windows 7 64-bit? The error code is 0x80040154, which is Class Not Registered.

The calling code (VB6) is:

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)

The returns from CLSIDFromString and IIDFromString are both 0 (Success). I can find the string in the registry. Since my taskbar is obviously working just fine, I know the interface is able to be called by other processes just fine.

ITaskBarList3 is declared in a typelib compiled using mktyplib.exe. I've double checked the GUID values, and they match those in the SDK.

Any help would be greatly appreciated.

shell
com
vb6
asked on Stack Overflow Jul 6, 2009 by Christopher • edited May 25, 2012 by John Koerner

3 Answers

4

The most likely reason is that the calling code is 32-bit and the COM server is 64-bit and therefore can't be loaded as an in-proc server.

A possible solution could be to create a COM+ application for the COM server to force its creation as an out-proc server. However this will not help if the COM server is meant to supply an ActiveX control.

I'm also surprised to see the class id being equal to the interface id - it's common practice to have them different. Since you are not the developer of the component implementing that interface but only the consumer it's likely that you just misplaced the class id with the interface id and this is the reason why your client program is not working. You should find the class id of the class implementing the ITaskBarList3 interface and use it as the class id.

answered on Stack Overflow Jul 6, 2009 by sharptooth • edited Jul 6, 2009 by sharptooth
1

CLSID_TaskbarList3 doesn't exist! It's simply,

CLSID_TaskbarList = "{56FDF344-FD6D-11D0-958A-006097C9A090}"

which indeed has a different GUID than the IID_TaskbarList3 IID.

In COM you have typically one class implementing one or more interface. There doesn't generally exist a new class for every interface.

answered on Stack Overflow Mar 15, 2017 by Rolf Kalbermatter • edited Dec 19, 2019 by tabdiukov
0

The ClassID wasn't the problem, as this worked correctly about a week ago. I was previously compiling on Windows Vista, 32-bit.

I've now updated my system to Windows 7, 64-bit. The problem isn't a matter of 32/64-bit compatibility. The TaskBar is accessible through Wow64, and I am able to call the interface just fine from a 32-bit ATL DLL.

I did some more searching, and I found a number of references on the web regarding problems with actxprxy.dll on 64-bit windows. This is the DLL where the interfaces appear to reside, according to OLE Viewer.

Anyways, some people have had luck with various combinations of .reg scripts and unregistering/re-registering the files. Unfortunately, I'm not one of those people.

I've decided to save myself the headache, and just wrote a small DLL using ATL, and I have the VB code calling that. Works fine in that setup...

Thanks again for your help.

answered on Stack Overflow Jul 6, 2009 by Christopher

User contributions licensed under CC BY-SA 3.0