1

这是我的第一个 SO 问题!我想实例化一个 COM 对象并将其转换为 IDispatchEx,以便我可以枚举其成员。这是一个例子:

    类型 _COMType = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
    var _COMObject = (IDispatchEx)Activator.CreateInstance(_COMType);

我的 IDispatchEx 与本网站(不是我的网站)上的相同,除了 GetNextDispID 和 GetMemberName 返回一个 int (我希望将其用于 HRESULT,如MSDN中所述)。

上面的例子不起作用。有没有办法像从 Active Scripting 强制转换到 IDispatchEx 接口一样实例化 COM 对象?

感谢您提供任何和所有帮助/建议!

4

2 回答 2

5

此操作失败,因为 IID 为“{A6EF9860-C720-11D0-9337-00A0C90DCAA9}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE)) .

您收到的异常消息非常清晰,Scripting.FileSystemObject 根本没有实现 IDispatchEx 接口。只有 IDispatch。这工作正常:

        Type t = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
        var obj = Activator.CreateInstance(t);
        var iobj = (stdole.IDispatch)obj;

大功告成,不能强制 COM coclass 实现接口。我不希望有很多 COM 类来实现它,IDispatchEx 非常晦涩。它适合 JScript 模具。

于 2011-04-30T19:27:48.567 回答
1

如果您希望在 C# 中使用它,您似乎需要自己定义此接口(源代码

这个线程可能是相关的 - 似乎有人找到了 IDispatchEx 的现有实现来使用。

于 2011-04-29T16:02:21.487 回答