【问题标题】:How do you instantiate an IDispatchEx in C#?如何在 C# 中实例化 IDispatchEx?
【发布时间】:2011-04-29 15:07:58
【问题描述】:

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

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

我的 IDispatchEx 与 on this website(不是我的网站)相同,只是 GetNextDispID 和 GetMemberName 返回一个 int(我希望将其用于 HRESULT,如 on MSDN 所述)。

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

感谢您的任何帮助/建议!

【问题讨论】:

    标签: c# com activex createinstance


    【解决方案1】:

    此操作失败,因为 COM 上的 QueryInterface 调用 带有 IID 的接口组件 '{A6EF9860-C720-11D0-9337-00A0C90DCAA9}' 由于以下错误而失败:否 支持此类接口(异常 从 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 模式。

    【讨论】:

    • 谢谢,汉斯。似乎也无法使用 IDispatch 枚举属性/方法。我可能不得不采取另一种方式......
    • 回到这一点——我错了:) 完全有可能使用 IDispatch 枚举成员用于后期绑定的 COM 对象(实现它)。我仍然在这方面学到很多东西。
    【解决方案2】:

    如果你想在C#中使用这个接口,你似乎需要自己定义它(source

    This thread 可能是相关的 - 似乎有人找到了 IDispatchEx 的现有实现来使用。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2017-06-22
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多