5

我正在使用以下代码访问 Windows Explorer Shell 的乐队站点服务:

Guid GUID_TrayBandSiteService = new Guid(0xF60AD0A0, 0xE5E1, 0x45cb, 0xB5, 0x1A, 0xE1, 0x5B, 0x9F, 0x8B, 0x29, 0x34);
Type shellTrayBandSiteService = Type.GetTypeFromCLSID(GUID_TrayBandSiteService, true);
site = Activator.CreateInstance(shellTrayBandSiteService) as IBandSite;

大多数情况下,它工作得很好。在极少数情况下(不到 1%),对 Activator.CreateInstance 的调用会引发以下异常:

System.Runtime.InteropServices.COMException (0x80040154): Retrieving the COM class factory for component with CLSID {F60AD0A0-E5E1-45CB-B51A-E15B9F8B2934} failed due to the following error: 80040154.
  at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
  at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
  at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
  at System.Activator.CreateInstance(Type type, Boolean nonPublic)

我查看了错误代码,它似乎表明该服务未注册。我很确定实际情况并非如此,因为调用会在几分钟后正常工作,并且 CLSID 由explorer.exe.

我难住了。什么可能导致 Activator.CreateInstance 失败,但很少发生?

4

3 回答 3

1

权限?是的,高完整性应用程序访问中等完整性应用程序中的 COM 对象时存在问题。在我的网站的某个地方,有一个正是这一点的演示。啊,但是对于TrayNotify班级,不是TrayBandSiteService。我希望你没有花太多时间来弄清楚你可能很容易读过的东西。

无论如何,请参阅本文的最后一段,我现在引用:

顺便说一句,请注意,如果启用了用户帐户控制 (UAC) 并且程序以提升的权限运行,则程序将失败。EXPLORER 是 COM 服务器, TRAYNOT(我的演示程序)是 COM 客户端。然而,EXPLORER 只有中等完整性。尽管微软关于 UAC 的说明——它们并不足以算作编程文档——处理的是低完整性 COM 客户端试图与高完整性 COM 服务器通信的情况,但奇怪的是很少提及相反的情况。较高完整性的 COM 客户端受到保护,不受较低完整性的 COM 服务器的影响,就像较高完整性的程序不受来自较低完整性程序的窗口消息的保护一样。对于后者,Microsoft 为完整性较高的程序提供了明确的方法,可以将自身开放给来自较低完整性来源的预期消息。为 COM 找到类似的规定可能是值得再做一次的练习。

我很遗憾地说我从来没有找到时间。

于 2010-09-22T04:38:56.223 回答
0

我在这里找到了一些关于 TrayBandSiteService 的解释: http ://www.geoffchappell.com/viewer.htm?doc=studies/windows/shell/explorer/classes/traybandsiteservice.htm

如果 Geoff Chappell 是对的,那可能与我的机器上的问题相同:有时资源管理器会重新启动,此时可能无法访问 TrayBandSiteService。

于 2010-05-26T18:11:40.033 回答
0

Activator.CreateInstance(typeof(MyType)) 当我尝试在独立的 Windows 应用程序中运行代码时工作正常。当我尝试在 wcf 服务下的类库中运行相同的代码时它失败了

于 2011-12-20T11:46:05.903 回答