【问题标题】:Get information or properties of COM objects获取 COM 对象的信息或属性
【发布时间】:2015-03-14 22:02:43
【问题描述】:

我正在编写一个工具,其中有一些带有清单文件(Sxs / RegFree)的 COM 组件(例如 DLL)。我的工具会遍历所有 Class-ID,并应检查它是否可以使用此 Class-ID 创建实例。

但是,有一些问题。一些 COM 对象(类)以某种方式编程,我无法创建实例,因为它被禁止。

在我的一次迭代中,我的工具崩溃了,因为它想从一个被禁止的对象创建一个实例。即使是 try ... catch 也无济于事。在使用 Visual Studio 2013 进行调试时,我得到了有关堆存在错误的信息。

所以我的问题是:以某种方式获取有关 COM 对象的一些信息是可能的,例如,是否有人可以在创建实例之前从该 Class-ID 创建一个实例?

编辑:这是我创建实例的代码:

var clsid = new Guid(guid);
Guid IID_IUnknown = new Guid("00000000-0000-0000-C000-000000000046");
object instance = null;
hResult = CoCreateInstance(ref clsid, null, CLSCTX_INPROC_SERVER, ref IID_IUnknown, out instance);
if (hResult > 0x7FFFFFFF)
{
    // ...
}

【问题讨论】:

  • 这种方法有很多问题。但首先当然是you are doing it wrong
  • @HansPassant:不,这不是解决方案。我的清单正在工作,因为我可以为许多类 ID 创建实例。但是有一个特殊的 Class-ID 与一个我得到堆错误的类。但是 DLL 已加载,因为我可以从同一个 DLL 但使用其他 Class-ID 创建实例。
  • 我没有提出解决方案,只是指出你做错了。追求这种方法是没有意义的,这样的 COM 组件在实践中永远无法工作。不管你在做什么也一定是非常错误的,“堆错误”是非常讨厌的错误。
  • @HansPassant:我在上面添加了我的 C#-Code,我想在其中创建实例。给定的 GUID 通常会从该 COM 对象创建一个实例。没有任何错误。但是使用特殊的 GUID 我得到一个堆错误。但是当我做错了什么(为此感到抱歉,我不知道是什么)时,如何纠正?
  • 如果您遇到堆错误,则说明 DLL 中存在错误。联系供应商。

标签: c# api winapi object com


【解决方案1】:

某些 CLSID 没有直接访问权限,只有在创建真实对象时才适用于 COM 系统。 当您创建像“VBScript”CLSID 之类的对象时:
“{B54F3741-5B07-11CF-A4B0-00AA004A55E8}”
COM 自动创建另一个对象供内部使用:
{00000323-0000-0000-C000-000000000046} (CLSID_StdGlobalInterfaceTable)
像这样最后有许多其他的只用于管理。 见:
Standards Assignments

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    相关资源
    最近更新 更多