CoCreateInstance在ITaskBarList3上以0x80040154失败

时间:2009-07-06 09:27:37

标签: shell com vb6

有没有人知道为什么CoCreateInstance会在Windows 7 64位上的ITaskBarList3上失败?错误代码为0x80040154,即未注册类。

调用代码(VB6)是:

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)

CLSIDFromString和IIDFromString的返回值均为0(成功)。我可以在注册表中找到该字符串。由于我的任务栏显然工作正常,我知道接口可以被其他进程调用就好了。

ITaskBarList3在使用mktyplib.exe编译的typelib中声明。我已经仔细检查了GUID值,它们与SDK中的值匹配。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

最可能的原因是调用代码是32位,COM服务器是64位,因此无法作为进程内服务器加载。

一种可能的解决方案是为COM服务器创建一个COM +应用程序,以强制它作为一个out-proc服务器创建。但是,如果COM服务器用于提供ActiveX控件,这将无济于事。

我也很惊讶地看到类id等于接口id - 通常的做法是让它们不同。由于您不是实现该接口的组件的开发人员,而只是消费者,因此您可能只是错误地将接口ID错误地放入了类ID,这就是您的客户端程序无法正常工作的原因。您应该找到实现ITaskBarList3接口的类的类id,并将其用作类ID。

答案 1 :(得分:1)

CLSID_TaskbarList3不存在!它只是CLSID_TaskbarList =" {56FDF344-FD6D-11D0-958A-006097C9A090}",它的确具有与IID_TaskbarList3 IID不同的GUID。

在COM中,通常有一个类实现一个或多个接口。每个界面通常不存在新类。

答案 2 :(得分:0)

ClassID不是问题,因为这在一周前正常工作。我之前在Windows Vista上编译32位。

我现在已将系统更新为64位Windows 7。问题不在于32/64位兼容性问题。 TaskBar可以通过Wow64访问,我可以从32位ATL DLL中调用接口。

我做了一些搜索,我在网上发现了一些关于64位Windows上actxprxy.dll问题的引用。根据OLE Viewer,这是接口看起来驻留的DLL。

无论如何,有些人幸运地使用.reg脚本的各种组合并取消注册/重新注册文件。不幸的是,我不是那些人之一。

我已经决定让自己头疼,只是用ATL编写了一个小DLL,我有VB代码调用它。在那个设置中工作得很好......

再次感谢您的帮助。