【发布时间】: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 中存在错误。联系供应商。