Dan*_*ach 5 c# com winapi createinstance winforms
我正在使用以下代码访问Windows资源管理器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;
Run Code Online (Sandbox Code Playgroud)
大多数情况下,它很有效.在很小的时间内(小于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)
Run Code Online (Sandbox Code Playgroud)
我查找了错误代码,似乎表明该服务未注册.我很确定实际情况并非如此,因为调用会在一段时间后正常工作,并且CLSID由提供explorer.exe.
我很难过.什么可能导致Activator.CreateInstance失败,但很少?
小智 1
权限?是的,高完整性应用程序访问中等完整性应用程序中的 COM 对象时存在问题。在我的网站上的某个地方有一个演示。啊,但是对于TrayNotify班级来说,不是TrayBandSiteService。我希望你没有花太多时间去弄清楚你可能很容易读过的东西。
无论如何,请参阅本文的最后一段,我现在从中引用:
另外,请注意,如果启用了用户帐户控制 (UAC) 并且程序以提升的权限运行,则程序会失败。EXPLORER 是 COM 服务器,TRAYNOT(我的演示程序)是 COM 客户端。然而 EXPLORER 只有中等完整性。尽管 Microsoft 关于 UAC 的说明(它们的内容还不足以算作编程文档)处理的是完整性较低的 COM 客户端尝试与完整性较高的 COM 服务器进行通信的情况,但奇怪的是,却很少提及相反的情况。较高完整性的 COM 客户端受到保护,免受较低完整性的 COM 服务器的影响,就像较高完整性的程序受到保护,不会从较低完整性的程序接收窗口消息一样。对于后者,Microsoft 为完整性较高的程序提供了明确的方法,使其能够接受来自较低完整性源的预期消息。下次寻找 COM 的类似规定可能是值得的。
我很遗憾地说我一直没有找到时间。